MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply TodayTo resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Asked by AP on 13 Oct 2012

Dear All,

How can I vectorize the following three nested loops? I tried using arrayfun but I did not succeed in doing it.

% Range of random number for x and y. L = 8; H = 6;

% The number of random numbers. n = 100;

% Randomly spaced data. x = rand( n, 1 )*L; y = rand( n, 1 )*H;

d = .01; [ X, Y ] = meshgrid( 0:d:L, 0:d:H );

TOL = .01; I = zeros(size(X));

for i=1:size(X,1) for j=1:size(X,2) for k=1:numel(x) dist = (X(i,j)-x(k))^2+(Y(i,j)-y(k))^2; if( dist<TOL) I(i,j) = 1; end end end end

Thanks,

Ahmad

*No products are associated with this question.*

Answer by Matt Fig on 13 Oct 2012

Edited by Matt Fig on 13 Oct 2012

Accepted answer

I2 = any((bsxfun(@minus,X,reshape(x,1,1,n)).^2 +... bsxfun(@minus,Y,reshape(y,1,1,n)).^2)<TOL,3) ;

Matt Fig on 13 Oct 2012

The code above **does** give the same result here.....

isequal(I,I2) ans =

1

I ran it 10 times, and every time I get the same thing. Here is the code I used to test that I and I2 ** are** equal. So what are you doing that says they are not equal? Did you run something other than what you posted?

% Range of random number for x and y. L = 8; H = 6; % The number of random numbers. n = 100; % Randomly spaced data. x = rand( n, 1 )*L; y = rand( n, 1 )*H; d = .01; [ X, Y ] = meshgrid( 0:d:L, 0:d:H ); TOL = .01; tic I = zeros(size(X));

for i=1:size(X,1) for j=1:size(X,2) for k=1:numel(x) dist = (X(i,j)-x(k))^2+(Y(i,j)-y(k))^2; if( dist<TOL) I(i,j) = 1; end end end end toc

tic I2 = any((bsxfun(@minus,X,reshape(x,1,1,n)).^2 +... bsxfun(@minus,Y,reshape(y,1,1,n)).^2)<TOL,3) ; toc

isequal(I,I2)

## 0 Comments