Умножим n векторов длины p на n матриц размера pxp - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть n комплексные векторы длины p, которые я хочу умножить на n комплексные матрицы размера p -by- p.Я ищу наиболее эффективный способ сделать это в MATLAB.Если это имеет значение, я представляю, что n большое, а p маленькое.

Пример использования цикла (которого я хотел бы избежать) показан ниже.

N = 1e4;
p = 5;
A = randn(p, N); % N vectors of length p
B = randn(p, p, N); % N matrices of size pxp

C = zeros(p, N); 
for k = 1:N
    C(:, k) = B(:, :, k) * A(:, k);
end

Было высказано предположение, что я мог бы добиться этого эффективно, используя тензорные функции, но яне смог понять это.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вот способ использования неявного расширения :

C = permute(sum(B.*permute(A, [3 1 2]), 2), [1 3 2]);

Для старых версий Matlab (до R2016b) его необходимо переписать с помощью bsxfun:

C = permute(sum(bsxfun(@times, B, permute(A, [3 1 2])), 2), [1 3 2]);
0 голосов
/ 24 сентября 2018

Вы можете сделать это различными способами:

A = rand(3, 3, 1e6);
B = rand(3, 1);
tic, C = zeros(3, size(A, 3));
for i = 1:size(A, 3)
  C(:,i) = A(:,:,i)*B ;
end, toc
tic; C = reshape(reshape(permute(A,[2,1,3]),3,[]).'*B,3,[]); toc
tic; C = squeeze(sum(bsxfun(@times, A, reshape(B, 1, 3)), 2)); toc

В моей системе:

Elapsed time is 2.067629 seconds.  % Loop
Elapsed time is 0.064164 seconds.  % permute
Elapsed time is 0.145738 seconds   % sum(times())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...