MATLAB:附加到预先分配的矩阵

Posted

技术标签:

【中文标题】MATLAB:附加到预先分配的矩阵【英文标题】:MATLAB : Appending to pre-allocated matrix 【发布时间】:2013-09-22 16:37:45 【问题描述】:

我有一些带有 mxn 矩阵的 MATLAB 代码。 最初,我将第一行放入其中,然后代码通过一个 for 循环运行,该循环将剩余的 m-1 行一一追加;循环的每次迭代都有一个。 正如预期的那样,MATLAB 建议我预先分配矩阵,因为它会随着循环的每次迭代而扩展。 因此,如果我在所有 m 行中预先分配零,MATLAB 很可能会在 m 行之后追加行(从第一个追加行的 m+1 开始),因为 m 行已经被填充(即使是零!) 在这种情况下是否有任何方法可以预先分配矩阵以提高速度?

【问题讨论】:

downvoters 愿意解释原因吗?不要粗鲁的家伙。我正在尝试在这里学习 MATLAB,这是我的第二个 MATLAB 程序。我在 SO 上找不到其他相关问题。 个人没有投票,但您的问题不清楚。通过包含您的代码的 sn-p 以及对最终矩阵应该是什么的一些想法(或者如果您的最终矩阵很大,则可以简化示例),这将大大改进。 @nkjt:现在清楚了吗? 我的意思是你应该展示你的代码(只是循环)。您可能正在做您不应该做的事情(正如 chappjc 建议的那样,将带有 A = [A; rowVec]; 的行附加到预先分配的矩阵上,也许)。 @nkjt:这正是我正在做的......我太愚蠢了...... 【参考方案1】:

您不能在不更改其大小的情况下预先分配 MATLAB 数组,至少不能手动进行。但是,MATLAB 在最近的版本中大大提高了自动数组增长的性能,因此您可能不会看到巨大的性能影响。不过,最佳做法是使用 zeros 预先分配您的数组并使用 A(i,:) = rowVec; 索引行,而不是附加一行 (A = [A; rowVec];)。

预分配

如果您决心充分利用 MATLAB 的性能,Yair Altman 有几篇关于内存预分配主题的优秀文章:

Preallocation performance Preallocation performance and multithreading

自动数组增长优化

如果您真的想通过沿维度增长来使用动态数组调整大小,有一些方法可以做到这一点。看到这个MathWorks blog post by Steve Eddins。需要注意的最重要的一点是,您应该沿着最后一个维度发展以获得最佳性能。 (即在您的情况下添加列)。 Yair 还在another post on his blog 中讨论了动态数组调整大小。

此外,还有一些方法可以在不使用一些毛茸茸的 MEX API 技巧进行初始化的情况下分配数组,但仅此而已。

【讨论】:

我认为这里回答@tumchaaditya 问题的关键是,一旦您预先分配了矩阵,您需要将输出行写入(最初为零)矩阵的正确行,而不是继续追加行。 @SchighSchagh:对。使用 A(i,:) = rowVec; 而不是 A = [A; rowVec];(或任何 tumchaaditya 正在做的事情)。

以上是关于MATLAB:附加到预先分配的矩阵的主要内容,如果未能解决你的问题,请参考以下文章

matlab矩阵内存预分配

在MATLAB中直接将大数组写入磁盘时,是不是需要预先分配?

Matlab:分配给具有列\行索引对的矩阵[重复]

matlab运行出现“变量似乎会随着迭代次数改变而变化,请预分配内存,以提高运行速度”问题

在 MATLAB mexFunction 中,如何将 GNU 科学库矩阵和向量分配给 plhs?

Matlab分配3D数组的1D切片