The loops in Matlaba no longer need to be feared or avoided on their own.
Of course, you should be very careful when using them, but, nevertheless, JIT can take care of many kinds of loops, improving performance even beyond built-in functions.
Consider the following test cases:
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(:))
Results:
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
Regardless of performance, I also find that the latter case is much more intuitive and readable than the case without a loop.