3D матричное умножение на 2D матрицу - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть матрица NxNx4 (A) и матрица 4x4 (B).Мне нужно умножить вектор a, состоящий из четырех элементов первой матрицы A, скажем,

a = A(1,1,1) 
    A(1,1,2)
    A(1,1,3)
    A(1,1,4)

на матрицу 4x4 B, но я не уверен, что существуетболее быстрое и умное решение, чем использование цикла for для построения вектора a.Существует ли способ сделать это вычисление с помощью нескольких строк кода?

Я построил A как

A(:,:,1) = rand(20);
A(:,:,2) = rand(20);
A(:,:,3) = rand(20);
A(:,:,4) = rand(20);

и матрицу B

B = rand(4);

Теперь я хочу умножить B на

B*[A(1,1,1);A(1,1,2);A(1,1,3);A(1,1,4)]

Это, для каждого элемента A

B*[A(1,2,1);A(1,2,2);A(1,2,3);A(1,2,4)]
B*[A(1,3,1);A(1,3,2);A(1,3,3);A(1,3,4)]
...

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Вы можете сделать это с помощью простого цикла, заметьте, * циклы не обязательно медленны в более новых версиях MATLAB.Пробег может варьироваться.

Преимущество циклов заключается в улучшении читабельности кода, очень ясно, что здесь происходит:

% For matrix A of size N*N*4
C = zeros( size( A ) );
for ii = 1:N
    for jj = 1:N
        C( ii, jj, : ) = B * reshape( A( ii, jj, : ), [], 1 );
    end
end
0 голосов
/ 21 декабря 2018

Циклическое решение, которое имеет хорошую производительность, особенно когда N большое:

s = size(A, 3);
C = A(:,:,1) .* reshape(B(:,1),1,1,[]);
for k = 2:s
    C = C + A(:,:,k) .* reshape(B(:,k),1,1,[]);
end
0 голосов
/ 21 декабря 2018

Я думаю, что это то, что вы хотите:

C = permute(sum(bsxfun(@times, permute(B, [3 4 2 1]), A), 3), [1 2 4 3]);

Проверьте:

>> C(1,2,:)
ans(:,:,1) =
   1.501739582138850
ans(:,:,2) =
   1.399465238902816
ans(:,:,3) =
   0.715531734553844
ans(:,:,4) =
   1.617019921519029
>> B*[A(1,2,1);A(1,2,2);A(1,2,3);A(1,2,4)]
ans =
   1.501739582138850
   1.399465238902816
   0.715531734553844
   1.617019921519029
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...