Обзор матричных и векторный операторов

Содержание:
Базовая линейная алгебра (BLA)
Дополнительные функции
Подматрицы, подвектора

Определения:

A, B, C

матрицы

u, v, w

вектора

i, j, k

целочисленные значения

t, t1, t2

скалярные значения

r, r1, r2

диапазоны (ranges), т. е. range(0, 3)

s, s1, s2

выборки (slices), т. е. slice(0, 1, 3)

Базовая линейная алгебра

стандартные операции: сложение, вычитание, умножение на скаляр

C = A + B; C = A - B; C = -A;
w = u + v; w = u - v; w = -u;
C = t * A; C = A * t; C = A / t;
w = t * u; w = u * t; w = u / t;

Вычисленные присваивания

C += A; C -= A; 
w += u; w -= u; 
C *= t; C /= t; 
w *= t; w /= t;

скалярное, крайнее и другие произведения

t = inner_prod(u, v);
C = outer_prod(u, v);
w = prod(A, u); w = prod(u, A); w = prec_prod(A, u); w = prec_prod(u, A);
C = prod(A, B); C = prec_prod(A, B);
w = element_prod(u, v); w = element_div(u, v);
C = element_prod(A, B); C = element_div(A, B);

Трансформации

w = conj(u); w = real(u); w = imag(u);
C = trans(A); C = conj(A); C = herm(A); C = real(A); C = imag(A);

Дополнительные функции

нормы

t = norm_inf(v); i = index_norm_inf(v);
t = norm_1(v);   t = norm_2(v); 
t = norm_inf(A); i = index_norm_inf(A);
t = norm_1(A);   t = norm_frobenius(A); 

произведения

axpy_prod(A, u, w, true);  // w = A * u
axpy_prod(A, u, w, false); // w += A * u
axpy_prod(u, A, w, true);  // w = trans(A) * u
axpy_prod(u, A, w, false); // w += trans(A) * u
axpy_prod(A, B, C, true);  // C = A * B
axpy_prod(A, B, C, false); // C += A * B

Примечание: Последний аргумент (bool init) функции axpy_prod является дополнительным. Текущее значение по умолчанию - true, но в будущем это может поменяться. Установка аргумента init в true эквивалентна вызову w.clear() перед axpy_prod. До сих пор существует определенная конкретизация для сжатых матриц, которые дают большую скорость по сравнению с prod.

w = block_prod<matrix_type, 64> (A, u); // w = A * u
w = block_prod<matrix_type, 64> (u, A); // w = trans(A) * u
C = block_prod<matrix_type, 64> (A, B); // w = A * B

Примечание: Размер блока может быть любым целым число. Однако, результирующая скорость сильно зависит от комбинации размера блока, CPU и компилятора. Функция block_prod разработана для больших плотных матриц.

обновления k-рангов

opb_prod(A, B, C, true);  // C = A * B
opb_prod(A, B, C, false); // C += A * B

Примечание: Последний аргумент (bool init) функции opb_prod дополнительный. вляется дополнительным. Текущее значение по умолчанию - true, но в будущем это может поменяться. Эта функция может давать увеличесние скорости, если матрица A имеет меньша столбцов, чем строк, т. к. произведение вычисляется как сумма крайних (outer) произведений.

Подматрицы, подвектора

Организация доступа к подматрицам и подвекторам через посредники (proxies), используя функции project:

w = project(u, r);         // подвектор вектора u, заданный диапазоном индекса r
w = project(u, s);         // подвектор вектора u, заданный выборкой индекса s
C = project(A, r1, r2);    // подматрица матрицы A, заданная двумя диапазонами индексов r1 и r2
C = project(A, s1, s2);    // подматрица матрицы A, заданная двумя выборками индексов s1 и s2
w = row(A, i); w = column(A, j);    // строка или колонка матрицы как вектор

project(u, r) = w;         // устанавливает подвектор вектора u, заданный диапазоном индекса r
project(u, s) = w;         // устанавливает подвектор вектора u, заданный выборкой индекса s
project(A, r1, r2) = C;    // устанавливает подматрицу матрицы A, заданную двумя диапазонами индексов r1 и r2
project(A, s1, s2) = C;    // устанавливает подматрицу матрицы A, заданную двумя выборками индексов s1 и s2
row(A, i) = w; column(A, j) = w;    // строка или колонка матрицы как вектор

Поддиапазоны и подвыборки векторов и матриц могут быть получены напрямую с помощью функций subrange и sublice:

w = subrange(u, 0, 2);         // подвектор из 2-х элементов из u
w = subslice(u, 0, 1, 2);      // подвектор из 2-х элементов из u
C = subrange(A, 0,2, 0,3);     // подматрица из 2х3 элементов матрицы A
C = subslice(A, 0,1,2, 0,1,3); // подматрица из 2х3 элементов матрицы A
subrange(u, 0, 2) = w;         // задает подвектор из 2-х элементов из u
subslice(u, 0, 1, 2) = w;      // задает подвектор из 2-х элементов из u
subrange(A, 0,2, 0,3) = C;     // задает подматрицу из 2х3 элементов матрицы A
subrange(A, 0,1,2, 0,1,3) = C; // задает подматрицу из 2х3 элементов матрицы A

Есть еще способы для доступа к некоторым элементам матрицы как к вектору:

matrix_vector_range<matrix_type> (A, r1, r2);
matrix_vector_slice<matrix_type> (A, s1, s2);

Пример: Для доступа к первым двум элементам подколонки матрицы мы получаем доступ к строке с выборкой с шагом по индексу 1 и столбцу с выборкой с шагом по индексу 0 следующим образом:
matrix_vector_slice<matrix_type> (A, slice(0,1,2), slice(0,0,2));