2014-07-10 83 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;