1

我正在寻找将可变行但恒定列数据垂直连接到一个“集合”矩阵中。

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

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

我目前预先分配了一个大的'ol集合矩阵,然后保留一个名为“myMatrixPtr”的单独标量变量。它指向下一个空闲行。然后我这样插入:

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

这很麻烦,我担心有一天早上我不会喝咖啡,我把事情搞砸了,覆盖了错误的数据,事情爆炸等等。

有没有更简单的方法来做到这一点?我不想插入行,我想使用我已经拥有的并在必要时分配新的大块。但是,如果有更好的方法,我很想听听和学习。

谢谢你的帮助!

4

1 回答 1

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),:);
于 2013-10-25T19:04:47.257 回答