簡體   English   中英

如何在單元格數組中添加矩陣?

[英]How can I add matrices inside a cell array?

我有一個(1xn)單元格數組A,其中每個矩陣都是1000x1000。

基本上,我想做A {1} + A {2} + A {3} + ... + A {n}

我事先不知道數組的大小。 所以我應該做一個size(A)並在其中添加所有可用的矩陣。

  • 我想使用循環總結所有這些
  • 但是最好以向量化的方式,因為我最終將添加數千個它們,並且需要提高速度。

我如何將數據存儲到單元格數組中:

for k = 1:length(pcpFileNames)
    pcp{k} = imread(pcpFileNames{k}); %Read all pcp files
end

where 

pcpFileNames = 

    'PCPRATE.20110612.000000.tif'
    'PCPRATE.20110612.000500.tif'
    'PCPRATE.20110612.001000.tif'
    'PCPRATE.20110612.001500.tif'
    'PCPRATE.20110612.002000.tif'
    'PCPRATE.20110612.002500.tif'
    'PCPRATE.20110612.003000.tif'
    'PCPRATE.20110612.003500.tif'
    'PCPRATE.20110612.004000.tif'
    'PCPRATE.20110612.004500.tif'

建議的解決方案不起作用:

pcpAccum = pcp{1};
for m = 2:numel(pcp)
    pcpAccum = pcpAccum + pcp{k};
end

這給了我錯誤的結果。 我檢查了一個單元格,即使它應該有1.8,它也具有零值(示例)。


工作方案

%Create a multidimensional array to store the data

precip = zeros(3501,7001,length(pcpFileNames)); %Pre-allocating an array

for k = 1:length(precipFileNames)
    precip(:,:,k) = imread(precipFileNames{k}); %Read all files
end

pcpAccum = sum(pcp,3); 

以向量化方式添加它們:

B = sum(cat(3,A{:}),3);

但是,如果您的矩陣已經很大,則以上述方式添加許多矩陣是一個非常糟糕的主意。 您的2D矩陣已經在內存中; 創建將矢量加法的3D矩陣將再次消耗該內存量,但是現在在連續的內存區域中 由於內存碎片,很有可能您將擁有全部的內存來執行矢量化總和,但不會在內存連續區域內 因此您的程序會不必要地失敗。

在這種情況下,我建議的是一個行為良好的循環:

B = A{1};
for k = 2:numel(A)
        B = B + A{k};
end;

但是,循環有其自身的問題,並且速度不是一個。 事實是,以不斷增長的方式進行累加可能會給您帶來精度錯誤(對於浮點類型)或整數溢出(對於整數類型)。

為了克服由imread返回的整數類型引起的溢出錯誤,請將數據轉換為更大的類型(最好的選擇是double ):

B = double(A{1});
for k = 2:numel(A)
        B = B + double(A{k});
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM