如何避免使用双 for
循环来构建矩阵 pos
,如下代码所示:
pos=[0 0];
for i=1:m;
for j=1:n;
pos=[pos; i j];
end
end
m
和 n
是数字,例如 500 和 900。
我必须找到更好的解决方案才能缩短计算时间。
非常感谢。
最佳答案
您可以通过 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)
,我为 X
和 Y
创建一个 n x m
网格code>,其中 X
的每一行从 1 进展到 m
,而 Y
的每一列从 1 进展到 n
.因此,它们都是 n x m 矩阵。使用 m = 4
和 n = 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
这几乎遵循您想要的格式。您会注意到,通过单独查看列,这可以实现您想要的效果,但您希望将所有 X
和 Y
堆叠在 中(n x m) + 1 x 2
矩阵(1 代表 [0 0]
)。我们现在要做的就是获取 X
和 Y
的每一列,并将它们堆叠在一起,为两者创建一个列。我们可以通过执行 X(:)
和 Y(:)
将所有这些堆叠在一起。 X(:)
将获取 X
的每一列并创建一个将所有列堆叠在一起的单个列。 Y(:)
也是如此。因此,我们首先通过附加 [0 0]
作为第一行来创建 pos
,然后附加 X(:)
和 Y(:)
作为列添加到pos
之后,从而完成pos
的构建。
让我们举一个例子来验证概念。假设我们使用与之前相同的值:
m = 4;
n = 5;
使用 for
循环,我们得到:
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
小注释
正如您所说,m
和 n
将相对较大,我建议您清除 X
和 Y<在继续之前,请从您的工作区中选择/code>。
X
和 Y
只是为了帮助您创建 pos
而创建的。由于您不再需要它们,因此在计算 pos
后,执行以下操作:
clear X;
clear Y;
关于matlab - 在 MATLAB 中构建一个包含向量分量的巨大矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24687489/