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