2013-06-12 20 views
2

我在for循環中使用meshgrid時犯了一個錯誤。讓我舉作爲一個例子下面的代碼:用meshgrid替換linspace

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 

來取代它能否請你幫我改寫這個代碼?

+1

我假設您的原始代碼中存在拼寫錯誤:您爲'k = 1:長度(y)'而循環'但是索引爲'y(j)'。你的意思是'y(k)'? – Floris

回答

4
x=linspace(0,100,100); 

首評:這不會產生[0 1 2 ... 100] - 爲您將使用linspace(0,100,101)因爲有在0:100

101元你實際上是非常接近獲得這一權利。只是不要把xxxx(:)(當時的形狀將是錯誤的,在年底):

[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循環的最裏面。我想不出一種擺脫它的方式,它不會讓你的代碼不易讀。

+0

我剛剛運行這段代碼,它不會產生與原始嵌套循環相同的結果。 –

+0

@EitanT - 我相信在原始代碼中幾乎肯定有一個錯字 - y的索引肯定是'k'而不是'j' ...但我同意你的觀點。 – Floris

+0

在這種情況下,是的。 +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]))); 

瞧!

+0

+1:就在我正要寫自己的時候。 'bsxfun'在過去幾天里正在發佈:) –

+0

@EitanT我只是在'bs​​xfun'上「飛」着 - 添加了一個[tag:bsxfun],歡迎您的加入。 – Shai

+0

@EitanT - 我們之前使用'vectorization'標籤進行過這個討論。我相信我吸取了教訓。正如你所看到的,我沒有把這個問題標記爲'bsxfun'。 – Shai