我在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
我想我在这里不必要地使用for循环并尝试用meshgrid替换它
[x,y]=meshgrid(0:1:100);
for i=1:4
r(i,:,:)=sqrt((x(:)-x0(i)).^2+(y(:)-y0(i)).^2);
end
你能帮我改写一下这段代码吗?
答案 0 :(得分:4)
x=linspace(0,100,100);
第一条评论:这不会产生[0 1 2 ... 100]
- 为此你会使用linspace(0,100,101)
,因为0:100
中有101个元素
你实际上非常接近这一点。只是不要将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循环可能没问题。我想不出一种摆脱它的方法,它不会使你的代码不那么可读。
答案 1 :(得分:4)
没有循环没有meshgrid - 只需与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] ) ) );
瞧!