Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
379498_A09A4_sarycheva_o_m_lekcii_po_kursu_chis...doc
Скачиваний:
40
Добавлен:
09.11.2019
Размер:
1.69 Mб
Скачать

5. 7. Скалярное умножение двух разреженных векторов

Оба вектора заданы в формате RR (c) U :

JA = 10 3 7 4

AN = 0.2 0.3 0.4 -0.7

JB = 5 4 10

BN = 0.6 0.7 0.5

Скалярное произведение двух векторов

.

Прямолинейная попытка вычислить С привела бы к многочисленным просмотрам массива JB . Действительно, первый ненулевой элемент массива AN (1) = 0,2 и занимает в массиве А десятое место, так как JА (1) = 10. Следовательно, 0,2 надо умножить на 10-й эле­мент вектора B , т.е. на 0, 5. Чтобы его найти, нужно просмотреть весь массив JВ и выяснить, что находится в BN (3) = 0.5. Таким образом, определим произведение .

Следующий ненулевой элемент вектора А JA (2) =3 и AN (2) = 0,3. Мы должны просмотреть весь массив JB , чтобы выяснить, что . Таким образом, для каждого элемента вектора А мы просматриваем сначала весь массив JВ . Эта процедура очень неэф­фективна.

Рассматриваемая ниже процедура требует только одного просмот­ра A и B плюс небольшое число арифметических операций доя каждо­го ненулевого элемент векторов. Введем в рассмотрение некоторый массив IР , длина которого равна длине векторов. Этот массив ука­зывает позиции ненулевых элементов в AN в порядке их следова­ния в JA :

позиция = 1 2 3 4 5 6 7 8 9 10

значение IP = 0 0 2 4 0 0 3 0 0 1 (5.2)

Этот массив сообщает, что хранится во второй позиции AN , -в третьей и т.д. С использованием массива указателей IР алгоритм выглядит следующим образом:

-обнуляем весь массив IР;

- просматриваем массив JА и в позиции массива IP , номера которых содержатся в массиве JA , заносим последовательно цифры 1, 2, 3 и 4, Например, цифру 1 заносим в IP (10), цифру 2 в IP (3) и т.д. Получаем (5.2):

-обращаемся к первому элементу массива JB , который говорит нам о том, что находится в первой позиции массива BN и ;

-обращаемся к массиву IP и обнаруживаем, что IP(5)= 0. Значит, , Произведение не вычисляется:

-обращаемся ко 2-му элементу массива JB и находим, что

-обращаемся к массиву IP и обнаруживаем, что IР(4) = 4. Значит,

- прибавляем к ячейке С произведение

-обращаемся к третьему элементу массива JB и видим JB(3)=10. Значит,

-обращаемся к массиву IP и обнаруживаем, что IP(10)=1. Значит

-прибавляем к ячейке С произведение получаем С =-0.49+0.1=-0.39

Ввиду того, что массив JB исчерпан, вычисление скалярного произведения на этом прекращается,

Если вектор A надо скалярно умножить на несколько векторов . B, то массив IP заполняется один раз и затем используется для вычисления соответствующих скалярных произведений. Этот алгоритм используется в случае умножения матрицы A на разреженный вектор b . При этом очевидно, что по вектору b один раз формируется массив указателей IP, а затем каждая 1-я строка матрицы умножается на вектор b , образуя скалярное произведение С(1). Просмотрев всю матрицу А с 1-й по n -ю строки мы получим разреженный вектор С . Часть элементов этого вектора могут быть нулевыми, если были нулевыми соответствующие, строки матрицы, либо номер ни одного из ННЭ данной строки матрица А не совпал с номером ННЭ вектора b.