首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用meshgrid替换linspace

用meshgrid替换linspace
EN

Stack Overflow用户
提问于 2013-06-12 20:44:39
回答 2查看 4.9K关注 0票数 2

我在for循环中使用了meshgrid,这是一个错误。让我以下面的代码为例:

代码语言:javascript
复制
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替换它。

代码语言:javascript
复制
[x,y]=meshgrid(0:1:100);
for i=1:4
   r(i,:,:)=sqrt((x(:)-x0(i)).^2+(y(:)-y0(i)).^2);
end

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-12 20:51:26

代码语言:javascript
复制
x=linspace(0,100,100);

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

实际上,你已经非常接近正确的方向了。只是不要把xx变成xx(:) (那样最后的形状就会错了):

代码语言:javascript
复制
[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循环保留下来可能是可以的。我想不出一种不会降低代码可读性的方法。

票数 4
EN

Stack Overflow用户

发布于 2013-06-12 21:03:51

没有循环,没有网格--只需享受bsxfun的乐趣

代码语言:javascript
复制
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] ) ) );

瞧!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17065838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档