MATLAB:附加到预先分配的矩阵
我有一些使用mxn矩阵的MATLAB代码。MATLAB:附加到预先分配的矩阵,matlab,memory-management,Matlab,Memory Management,我有一些使用mxn矩阵的MATLAB代码。 最初,我将第一行放入其中,然后代码通过一个for循环运行,该循环将剩余的m-1行逐个追加;循环每次迭代一次。 正如预期的那样,MATLAB建议我预先分配矩阵,因为它随着循环的每次迭代而扩展。 因此,如果我在所有m行中预先分配了零,MATLAB很可能会在m行之后追加行(从m+1开始追加第一行),因为m行已经被填充(即使是用零!) 在这种情况下,有没有办法预先分配矩阵以提高速度 如果不改变MATLAB数组的大小,就不能预先分配它,至少不能手动分配。然而,在
最初,我将第一行放入其中,然后代码通过一个for循环运行,该循环将剩余的m-1行逐个追加;循环每次迭代一次。
正如预期的那样,MATLAB建议我预先分配矩阵,因为它随着循环的每次迭代而扩展。 因此,如果我在所有m行中预先分配了零,MATLAB很可能会在m行之后追加行(从m+1开始追加第一行),因为m行已经被填充(即使是用零!)
在这种情况下,有没有办法预先分配矩阵以提高速度 如果不改变MATLAB数组的大小,就不能预先分配它,至少不能手动分配。然而,在最近的版本中,MATLAB极大地提高了自动阵列增长性能,所以您可能不会看到巨大的性能损失。不过,最好的做法是预先为数组分配
0
,并使用A(i,:)=rowVec代码>而不是追加一行(a=[a;rowVec];
)
预分配
如果您决心从MATLAB中挤出每一点性能,Yair Altman有几篇关于内存预分配的优秀文章:
自动阵列生长优化
如果您真的想通过沿维度增长来使用动态数组大小调整,有几种方法可以正确执行。看看这个。需要注意的最重要的一点是,您应该沿着最后一个维度增长,以获得最佳性能。(即在您的案例中添加列)。Yair还讨论了中的动态数组大小调整
另外,也有一些方法可以在不初始化的情况下使用一些复杂的MEX API技巧来分配数组,但仅此而已。?不要做粗鲁的家伙。我正在这里学习MATLAB,这是我的第二个MATLAB程序。。我找不到其他相关的问题,所以我个人没有投反对票,但你的问题不清楚。如果包含一段代码,以及一些关于最终矩阵应该是什么的想法(或者如果最终矩阵很大的话是一个简化的例子),它将得到极大的改进。@nkjt:现在清楚了吗?我刚才说的是你应该显示你的代码(只是循环)。你可能正在做一些你不应该做的事情(正如chappjc所建议的,在预先分配的矩阵上添加带有A=[A;rowVec];
的行)。@nkjt:这正是我所做的……我太傻了……我想这里回答@tumchaaditya问题的关键是,一旦你预先分配了矩阵,您需要将输出行写入(最初为零)矩阵的正确行,而不是继续追加行。@SchighSchagh:对。使用A(i,:)=rowVec代码>而不是A=[A;rowVec]代码>(或者tumchaaditya正在做的任何事情)。