2014-04-28 101 views
1

我有53个不同的(40,000 x 2000)稀疏矩阵的单元格数组。我需要在第三维上取平均值,以便例如元素(2,5)在53个单元格间取平均值。这应该产生一个(33,000 x 2016)输出。我认为应该有一种方法可以通过cellfun()完成此操作,但是我无法编写一个在单元内索引中跨越单元的函数。Matlab对单元格上的相同索引元素的均值

+0

为什么'33000 X 2016'?使用53x40000x2000备用矩阵不是一种选择? – Daniel

+1

@Daniel问题是Matlab不支持稀疏3D数组 –

+2

如何从53 40000x2000矩阵得到33000x2016结果? –

回答

1

您可以从稀疏矩阵转换为非零项的指数和值,然后用sparse自动获取稀疏形式的总和:

myCell = {sparse([0 1; 2 0]), sparse([3 0; 4 0])}; %// example 

C = numel(myCell); 
M = cell(1,C); %// preallocate 
N = cell(1,C); 
V = cell(1,C); 
for c = 1:C 
    [m n v] = find(myCell{c}); %// rows, columns and values of nonzero entries 
    M{c} = m.'; 
    N{c} = n.'; 
    V{c} = v.'; 
end 
result = sparse([M{:}],[N{:}],[V{:}])/C; %'// "sparse" sums over repeated indices 
+0

这个和Raab70的评论都很有帮助 - 谢谢!我检查过这个,因为稀疏命令是一个很棒的技巧。 – cataclysmic

0

这应该做的伎俩,只是初始化一个空的数组和总结单元格数组的每个元素。我看不出有什么办法解决使用for循环没有串联成一个巨大的三维阵列(这将几乎可以肯定耗尽内存)

running_sum=zeros(size(cell_arr{1})) 
for i=1:length(cell_arr) 
    running_sum=running_sum+cell_arr{i}; 
end 
means = running_sum./length(cell_arr);