Matlabのループは、もはや恐れたり、回避したりするものではありません。
確かに、それらを使用するときは細心の注意を払う必要がありますが、それでも、JIT はさまざまな種類のループを処理し、組み込み関数を超えてパフォーマンスを向上させることができます。
次のテスト ケースを検討してください。
clc
m = 512; n = 384;
p = 5; q = 3;
A = rand(m,n,p); % some sample data
B = rand(m,n,q); % some sample data
%% non-loop approach
tic
A2 = reshape(A,[],p);
B2 = reshape(B,[],q);
C2 = arrayfun(@(ii) A2(ii,:)'*B2(ii,:),1:m*n,'uni',false);
C0 = permute(reshape(cell2mat(C2),p,q,m,n),[3 4 1 2]);
toc
%% looped approach, simplest
tic
C = zeros(m,n,p,q);
for mm = 1:m
for nn = 1:n
C(mm,nn,:,:) = ...
squeeze(A(mm,nn,:))*squeeze(B(mm,nn,:)).';
end
end
toc
% check for equality
all(C0(:) == C(:))
%% looped approach, slightly optimized
tic
C = zeros(m,n,p,q);
pp = zeros(p,1);
qq = zeros(1,q);
for mm = 1:m
for nn = 1:n
pp(:) = A(mm,nn,:);
qq(:) = B(mm,nn,:);
C(mm,nn,:,:) = pp*qq;
end
end
toc
% check for equality
all(C0(:) == C(:))
%% looped approach, optimized
tic
C = zeros(p,q,m*n);
A2 = reshape(A,[],p);
B2 = reshape(B,[],q);
for mn = 1:m*n
C(:,:,mn) = A2(mn,:).'*B2(mn,:);
end
C = permute(reshape(C, p,q,m,n), [3,4,1,2]);
toc
% check for equality
all(C0(:) == C(:))
結果:
Elapsed time is 3.955728 seconds.
Elapsed time is 21.013715 seconds.
ans =
1
Elapsed time is 1.334897 seconds.
ans =
1
Elapsed time is 0.573624 seconds.
ans =
1
パフォーマンスに関係なく、最後のケースは非ループのケースよりもはるかに直感的で読みやすいと思います。