MATLAB: Reduce time taken to execute nested for loop

nested forsubtraction

Hi,
I am trying to subtract two matrix. and my program is as follows :
for i=1:length(B)
for j=1:length(A)
Y(j,:)=B(i,:)-A(j,:); %(takes one row of B and subtracts it with each row of A)
end
end
Now the inner for loop takes about 0.37 seconds. But my matrices are huge A[7000,100] & B[4000,1000]. Hence the above nested for loop takes about half hour+ to execute completely. Can anyone please suggest a much faster way to do the same. (hopefully in a minute or two)

Best Answer

1. Pre-allocate the output! 2. Relying on LENGTH to reply the wanted dimension is prone to errors. Use SIZE(X, dim) instead.
lenA = size(A, 1);
lenB = size(B, 1);
Y = zeros(lenA, lenB);
for i = 1:lenB
for j = 1:lenA
Y(j,:) = B(i,:) - A(j,:);
end
end
Now the values of Y are overwritten completely in every iteration of the for i loop. Most likely this is not intented. If this problem is fixed, you can try if BSXFUN or manual expansion by ONES is faster instead of the inner loop:
Y = bsxfun(@minus, B(i, :), A);
% Or:
Bi = B(i, :);
Y = Bi(ones(1, lenA), :) - A;