Re: [討論] 三維矩陣運算已回收
下面的程式你試試看。
如果 P 比 M,N 小,
第二種、第三種方法會比較快,
第三種方法又是最吃記憶體的。
在我的電腦上,M = 1000, N = 1000, P = 10
t1 = 4.65
t2 = 0.51
t3 = 0.32
這裏有個小問題也請大家看看,
如果我把 A = round(A); 去掉,
會發現 B1 的結果和 B2, B3 不同,
應該是精度的問題。不知那個是正確的?
clc;100
clear all;
M = 1000;
N = 1000;
P = 10;
A = 10*rand(M,N,P);
A = round(A);
% A = zeros(M,N,P);
% for i = 1:P
% A(:,:,i) = i;
% end
V = 1:P;
% Algorithm 1
A = shiftdim(A,2);
tic;
B1 = zeros(M,N);
for i = 1:M
for j = 1:N
B1(i,j) = V*A(:,i,j);
end
end
t1 = toc;
A = shiftdim(A,1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Algorithm 2
tic;
temp = zeros(M,N,P);
for i = 1:P
temp(:,:,i) = A(:,:,i)*V(i);
end
B2 = sum(temp,3);
clear temp;
t2 = toc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Algorithm 3
tic
v = repmat(reshape(V, [1 1 P]), [M N]);
temp = bsxfun(@times, A, v);
B3 = sum(temp,3);
clear temp;
t3 = toc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
isequal(B1,B2,B3)
isequal(B1,B2)
isequal(B2,B3)
isequal(B1,B3)
t1
t2
t3
※ 編輯: oversky0 來自: 220.128.221.133 (10/21 11:08)
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
討論
1
2