我在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你能帮我重写这段代码吗?
发布于 2013-06-12 20:51:26
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循环保留下来可能是可以的。我想不出一种不会降低代码可读性的方法。
发布于 2013-06-12 21:03:51
没有循环,没有网格--只需享受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] ) ) );瞧!
https://stackoverflow.com/questions/17065838
复制相似问题