|
матрицы |
|
вектора |
|
целочисленные значения |
|
скалярные значения |
|
диапазоны
(ranges), т. е. |
|
выборки
(slices), т. е. |
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
разработана для больших плотных матриц.
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));