Подход №1
С несколькими reshape
и умножение матриц -
A1 = reshape(A,N^3,N)*conj(v)
A2 = reshape(A1,N^2,N)*v
w = reshape(A2,N,N)*v
Подход № 2
С одним bsxfun
, reshape
и matrix-multiplication
-
A1 = reshape(A,N^3,N)*conj(v)
vm = bsxfun(@times,v,v.')
w = reshape(A1,N,N^2)*vm(:)
Бенчмаркинг
В этом разделе сравнивается время выполнения для двух подходов, перечисленных в этом сообщении, первый проверенный подход в сообщении Шай и исходный подход, указанный в вопросе. .
Код сравнительного анализа
N=100;
A=rand(N,N,N,N);
v=rand(N,1);
disp('----------------------------------- With Original Approach')
tic
%// .... Code from the original post ...//
toc
disp('----------------------------------- With Shai Approach #1')
tic
s4 = sum( bsxfun( @times, A, permute( conj(v), [4 3 2 1] ) ), 4 );
s3 = sum( bsxfun( @times, s4, permute( v, [3 2 1] ) ), 3 );
w2 = s3*v;
toc
disp('----------------------------------- With Divakar Approach #1')
tic
A1 = reshape(A,N^3,N)*conj(v);
A2 = reshape(A1,N^2,N)*v;
w3 = reshape(A2,N,N)*v;
toc
disp('----------------------------------- With Divakar Approach #2')
tic
A1 = reshape(A,N^3,N)*conj(v);
vm = bsxfun(@times,v,v.');
w4 = reshape(A1,N,N^2)*vm(:);
toc
Результаты выполнения
----------------------------------- With Original Approach
Elapsed time is 4.604767 seconds.
----------------------------------- With Shai Approach #1
Elapsed time is 0.334667 seconds.
----------------------------------- With Divakar Approach #1
Elapsed time is 0.071905 seconds.
----------------------------------- With Divakar Approach #2
Elapsed time is 0.058877 seconds.
Выводы
Второй подход в этом посте, похоже, дает примерно 80x
ускорение по сравнению с исходным подходом.
person
Divakar
schedule
09.03.2015
N
? - person Divakar   schedule 09.03.2015*
вv*
указывает на транспонирование? - person kkuilla   schedule 09.03.2015Conjugate
Наверное. - person Divakar   schedule 09.03.2015A
разреженной матрицей? - person Shai   schedule 09.03.2015