MATLAB - 将行插入更大的预分配零点矩阵

时间:2013-10-25 15:10:02

标签: matlab

我希望将变量行但垂直的常量列数据连接成一个“集合”矩阵。

当动态扩展收集矩阵时,我的性能会变慢(原因很明显)。我想预先分配这个集合矩阵(归零),然后用新行数据逐渐覆盖零。我通常不知道我总共有多少行数据,所以我可能不得不超过矩阵大小然后减少。

所以,我的问题是,如何有效地 AND 安全地做到这一点?

我目前预先分配了一个大的收集矩阵,然后保留一个名为“myMatrixPtr”的单独标量变量。它指向下一个自由行。然后我插入:

myMatrix(myMatrixPtr:(myMatrixPtr+numOfNewRows)-1, :) = newRowData;

这非常麻烦,我担心有一天早上我不会喝咖啡,搞砸了,弄错了数据,事情爆炸等等。

有更简单的方法吗?我不想插入行,我想使用我已经拥有的东西并分配新的大块,如果必须的话。但是,如果有更好的方法,我很乐意听到并学习。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

不,这就是你如何做到的。唯一的补充就是你实际上没有;只要你有一个聪明的重新分配方案,你就需要让你的积累阵列开始很大。当你的空间不足时,我最喜欢的是大小加倍。

快速端到端实施如下。

nCols = 4;
initSize = 1024;
ixNext = 1;

dataAccumulation = zeros(initSize, nCols);
collectionComplete = false;


while ~collectionComplete
    %Newly collected data
    newCollectedData = randn(ceil(rand*15),nCols);

    %Some row computations
    numOfNewRows = size(newCollectedData,1);
    ixLastInsertRow = ixNext+numOfNewRows-1;

    %Double the accumulation array if needed
    if size(dataAccumulation,1)<ixLastInsertRow
        dataAccumulation(size(dataAccumulation,1)*2,1)=0;
    end

    %Place the data and increment pointer
    dataAccumulation(ixNext:ixLastInsertRow, :) = newCollectedData;
    ixNext = ixLastInsertRow + 1;

    %Deterimine if we want to continue
    collectionComplete = (rand<0.001);
end

%Trim to size
dataAccumulation = dataAccumulation(1:(ixNext-1),:);