В этом вопросе я рассмотрел две пользовательские функции для умножения массивов матриц 3х3 и векторов 3х1, сохранения структуры трехмерного (матричного) внутреннего произведения и превращения всего процесса в вычислительно эффективный имаксимально быстро.
Теперь я обобщил эти функции на многомерные массивы (NxN) из матриц 3x4 и векторов 3x1.Вот функции, которые я написал и которые используют циклы for.
BlockScalar
Эта функция должна умножить элемент ij (скаляр) матрицы (NxN)) nv элементом ij (матрица 3x3) из A (матрица NxNx3x3).Так что это по сути многомерная версия произведения матрицы на скаляр.
function [B] = BlockScalar(nv,A)
N=size(nv,1);
B=zeros(N,N,3,3);
for i=1:N
for j=1:N
B(i,j,:,:)= nv(i,j).*A(i,j,:,:);
end
end
end
-------- Пример BlockScalar
Входные данные:
N=2;
A = shiftdim( repmat( eye(3,3), 1, 1, N, N ), 2 );
nv=[1 2; 3 4];
Выход:
BlockScalar (nv, A)
ans (:,:, 1,1) =
1 2
3 4
ans (:,:, 2,1) =
0 0
0 0
ans (:,:, 3,1) =
0 0
0 0
ans (:,:, 1,2) =
0 0
0 0
ans (:,:, 2,2) =
1 2
3 4
ans (:,:, 3,2) =
0 0
0 0
ans (:,:, 1,3) =
0 0
0 0
ans (:,:, 2,3) =
0 0
0 0
ans (:,:, 3,3) =
1 2
3 4
BlockMatrix
Эта вторая функция в настоящий момент не работает, потому что я изо всех сил пытаюсь реализовать матрицупроизведение A*u
между ij-м элементом (который представляет собой матрицу 3x3), равным A
, и вектором столбца, который содержит 3 компонента ij-го элемента u
.Как вы можете легко видеть, я хотел бы, чтобы это было многомерное обобщение матричного * векторного произведения в 3-D.
function [B] = BlockMatrix(A,u)
N = size(u,2);
B = zeros(N,N,3);
for i=1:N
for j=1:N
B(i,j,:)= reshape(reshape(A(i,j,:,:),[3,3])*reshape(u(i,j,:),[1 3]),size(u));
end
end
------- Пример BlockMatrix
Если вход представляет собой обобщенную единичную матрицу (элементы NxN, каждый из которых представляет собой единичную матрицу 3x3), а матрица NxN состоит из векторов 3x1:
N=2;
A = 4.*shiftdim( repmat( eye(3,3), 1, 1, N, N ), 2 );
c = ones(2,2);
V(1,1,:)=[1 2 3];
u = c.*V;
Требуемый выходной сигнал явнообъект, имеющий структуру V (матрица NxN, состоящая из векторов 3x1), где каждый из элементов представляет собой матричное произведение reshape(A(i,j,:,:),[3 3])
и reshape(V(i,j,:),[1 3])
.То есть:
i=1;j=1;
reshape(B(i,j,:),[3,1])
ans =
4
8
12
для любых i
и j
.
Полный вывод для полноты:
B (:,:, 1) =
4 4
4 4
B (:,:, 2) =
8 8
8 8
B (:,:, 3) =
12 12
12 12
Вопросы
Я изо всех сил пытаюсь (0) заставить BlockMatrix работать;(1) найти способ правильно векторизовать это, и (2) я даже не уверен, что векторизованная версия будет быстрее.
Буду признателен за любую помощь в ответе на вышеприведенные вопросы.