我希望将变量行但垂直的常量列数据连接成一个“集合”矩阵。
当动态扩展收集矩阵时,我的性能会变慢(原因很明显)。我想预先分配这个集合矩阵(归零),然后用新行数据逐渐覆盖零。我通常不知道我总共有多少行数据,所以我可能不得不超过矩阵大小然后减少。
所以,我的问题是,如何有效地 AND 安全地做到这一点?
我目前预先分配了一个大的收集矩阵,然后保留一个名为“myMatrixPtr”的单独标量变量。它指向下一个自由行。然后我插入:
myMatrix(myMatrixPtr:(myMatrixPtr+numOfNewRows)-1, :) = newRowData;
这非常麻烦,我担心有一天早上我不会喝咖啡,搞砸了,弄错了数据,事情爆炸等等。
有更简单的方法吗?我不想插入行,我想使用我已经拥有的东西并分配新的大块,如果必须的话。但是,如果有更好的方法,我很乐意听到并学习。
感谢您的帮助!
答案 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),:);