如何在单元格数组中添加矩阵?

时间:2016-02-17 18:14:59

标签: arrays matlab matrix

我有一个(1xn)单元阵列A,其中每个矩阵是1000x1000。

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

我事先并不知道阵列的大小。所以我应该做一个大小(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); 

1 个答案:

答案 0 :(得分:1)

以矢量化方式添加它们:

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;