2014-07-10 116 views
2

如何避免爲了建立一個矩陣pos像這樣的代碼中使用雙for循環的作用:建立與矢量分量巨大的矩陣在MATLAB

pos=[0 0]; 
    for i=1:m; 
    for j=1:n; 
    pos=[pos; i j]; 
    end 
end 

mn是數字,如500和900

爲了提高計算時間,我必須找到更好的解決方案。

非常感謝。

+1

不知道的語言(matlab的?)我要去猜測某種形式的'meshgrid'的。 – U2EF1

+0

答案可能與語言有關。你在用什麼語言? – user3288829

+0

赦免matlab! – Kevin

回答

3

您可以通過meshgrid輕鬆完成此操作。

[X,Y] = meshgrid(1:m, 1:n); 
pos = [0 0; X(:) Y(:)]; 

以上代碼的工作原理如下。 meshgrid(在這種情況下)創建了一個(X,Y)座標的2D網格。 X水平前進,而Y垂直前進。正如我們在for循環中看到的那樣,m定義了水平邊界,而n表示了垂直邊界。通過調用meshgrid(1:m, 1:n),我創建一個n x m網格都XY,其中X每行前進1至m,而Y每列前進從1到n。因此,這些都將是n x m矩陣。調用以上m = 4n = 5計算:

m = 4; 
n = 5; 
[X,Y] = meshgrid(1:m, 1:n) 

X = 

1  2  3  4 
1  2  3  4 
1  2  3  4 
1  2  3  4 
1  2  3  4 

Y = 

1  1  1  1 
2  2  2  2 
3  3  3  3 
4  4  4  4 
5  5  5  5 

幾乎跟着你希望的格式。您會注意到,通過單獨查看列可以達到您想要的效果,但是您希望將所有XY都堆疊在(n x m) + 1 x 2矩陣中(1代表[0 0])。我們現在要做的就是取XY的每一列,並將它們堆疊在一起,爲兩者創建一個列。我們可以通過做X(:)Y(:)將所有這些堆疊在一起。 X(:)將採取X的每一列,並創建一個列,將所有列堆疊在一起。 Y(:)也一樣。因此,我們首先通過附加[0 0]作爲第一行創建pos,然後我們將X(:)Y(:)作爲列添加到pos之後,從而完成pos的構建。

讓我們舉一個例子作爲概念驗證。假設我們使用相同的值就像我們之前:使用您for循環

m = 4; 
n = 5; 

,我們得到:

pos = 

0  0 
1  1 
1  2 
1  3 
1  4 
1  5 
2  1 
2  2 
2  3 
2  4 
2  5 
3  1 
3  2 
3  3 
3  4 
3  5 
4  1 
4  2 
4  3 
4  4 
4  5 

使用自己編寫的代碼中,我們還可以得到:

pos = 

0  0 
1  1 
1  2 
1  3 
1  4 
1  5 
2  1 
2  2 
2  3 
2  4 
2  5 
3  1 
3  2 
3  3 
3  4 
3  5 
4  1 
4  2 
4  3 
4  4 
4  5 

小注

正如您所述,mn會比較大,我建議您在繼續之前從工作區中清除XYXY僅用於幫助您創建pos。當你不需要他們了,你算算pos後,做:

clear X; 
clear Y;