下面的循環可以被矢量化嗎?循環中的每次迭代形成一個外積,然後將結果對稱化並將結果存儲爲矩陣中的一列。預計m
很大(例如1e4)並且s
很小(例如10)。如何矢量化許多1級外部產品的形成?
% U and V are m-by-s matrices
A = zeros(s^2, m); % preallocate
for k = 1:m
Ak = U(k,:)' * V(k,:);
Ak = (Ak + Ak')/2;
A(:, k) = Ak(:);
end
編輯
這裏是3種不同的方法進行了比較:遍歷大尺寸m
,迭代小尺寸s
和bsxfun
基於溶液(接受的,最快的答案) 。
s = 5; m = 100000;
U = rand(m, s);
V = rand(m, s);
% Iterate over large dimension
tic
B = zeros(s^2, m);
for k = 1:m
Ak = U(k,:)' * V(k,:);
Ak = (Ak + Ak')/2;
B(:, k) = Ak(:);
end
toc
% Iterate over small dimension
tic
A = zeros(s, s, m);
for i = 1:s
A(i,i,:) = U(:, i) .* V(:, i);
for j = i+1:s
A(i,j,:) = (U(:,i).*V(:,j) + U(:, j).*V(:, i))/2;
A(j,i,:) = A(i,j,:);
end
end
A = reshape(A, [s^2, m]);
toc
% bsxfun-based solution
tic
A = bsxfun(@times, permute(U, [1 3 2]), permute(V, [ 1 2 3 ]));
A = .5 * (A + permute(A, [1 3 2]));
B = reshape(A, [m, s^2])';
toc
這是一個時間比較:
Elapsed time is 0.547053 seconds.
Elapsed time is 0.042639 seconds.
Elapsed time is 0.039296 seconds.
第一次優化後問題仍然相關嗎?看起來你有一個X10加速。 –
@EitanT'bsxfun'可以給你額外的50% - 看到我的回答 – Shai