matlab - 在 MATLAB 中构建一个包含向量分量的巨大矩阵

标签 matlab for-loop vector matrix

如何避免使用双 for 循环来构建矩阵 pos,如下代码所示:

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

mn 是数字,例如 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),我为 XY 创建一个 n x m 网格code>,其中 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的构建。

让我们举一个例子来验证概念。假设我们使用与之前相同的值:

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

小注释

正如您所说,mn 将相对较大,我建议您清除 XY<在继续之前,请从您的工作区中选择/code>。 XY 只是为了帮助您创建 pos 而创建的。由于您不再需要它们,因此在计算 pos 后,执行以下操作:

clear X; 
clear Y;

关于matlab - 在 MATLAB 中构建一个包含向量分量的巨大矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24687489/

相关文章:

matlab - 计算机视觉中的卡尔曼滤波器 : the choice of Q and R noise covariances

arrays - 在 Matlab 中将矩阵中的元素 i,j 设置为 i*j

arrays - 对包含奇数大小数组的结构中的每个元素求和 [MATLAB]

c++ - 可以原子地获取和运算的最大数据类型?

function - Matlab 中带有函数名的变量的警告

c - 如何正确地将数组传递给结构体

python - 为什么我的列表在我尝试 append 它们时没有加入 Python

c++ - 对于循环长度问题

javascript - 生成给定大小的随机 5d 向量

c++ - 使用 -std=gnu++11 开关编译时出现 std::equal 错误