2

我在 for 循环中使用 meshgrid 犯了一个错误。让我举个例子,下面的代码:

x=linspace(0,100,100);
y=linspace(0,100,100);
x0=[0 1 2 3];
y0=[4 5 6 7];
for i=1:4
   for j=1:length(x)
      for k=1:length(y)
         r(i,j,k)=sqrt((x(j)-x0(i)).^2+(y(k)-y0(i)).^2);
      end
   end
end

我想我在这里不必要地利用了循环并尝试用 meshgrid 替换它

[x,y]=meshgrid(0:1:100);
for i=1:4
   r(i,:,:)=sqrt((x(:)-x0(i)).^2+(y(:)-y0(i)).^2);
end

你能帮我重写这段代码吗?

4

2 回答 2

4

没有循环没有网格 - 只是玩得开心bsxfun

dx = bsxfun( @minus, linspace( 0, 100, 100 ), x0' ).^2; %//'
dy = bsxfun( @minus, linspace( 0, 100, 100 ), y0' ).^2; %//'
r = sqrt( bsxfun( @plus, permute( dx, [2 1 3] ), ...
                         permute( dy, [2 3 1] ) ) );

瞧!

于 2013-06-12T13:03:51.047 回答
4
x=linspace(0,100,100);

第一条评论:这不会产生[0 1 2 ... 100]- 因为你会使用它,linspace(0,100,101)因为里面有 101 个元素0:100

实际上,您已经非常接近正确了。只是不要xx变成xx(:)(那么最后形状会出错):

[xx yy] = meshgrid(0:100, 0:100); % I like to use xx and yy to remind myself they are 2d...

x0=[0 1 2 3];
y0=[4 5 6 7];
for ii=1:4 % I use ii since i is also used as a built in variable with value sqrt(-1)
    r(ii,:,:) = sqrt((xx - x0(ii)).^2 + (yy - y0(ii)).^2);
end

离开最里面的 for 循环可能是可以的。我想不出一种方法来摆脱它不会使您的代码不那么可读。

于 2013-06-12T12:51:26.050 回答