[英]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.