如何将函数应用于matlab中包含3D Matrix的单元格数组中的每个单元格?

时间:2017-12-11 13:08:51

标签: matlab for-loop mean cell-array variance

我有一个单元格数组A,维度为1x8,每个单元格由10x13xN matirx(数值)组成。

示例:

10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double

现在我想在N上采用10x13(130值)的均值和方差,即(1,1,1)(1,1,2)......(1,1,N)。前2个值表示点,第3个值表示位置。

当我尝试使用cellfun函数对上述相同维度和单元格值的1x8 Cell数组应用均值时,会出现以下错误。

A = 1x8 cell

B = cellfun(@mean,A)

Error using cellfun Non-scalar in Uniform output, at index 1, output 1. Set 'UniformOutput' to false.

我需要在1x8 Cellarray的8个元素中只有260个值(均值+方差)的结果,顺便说一句,我可以忽略N个值,因为我取N的均值和方差。 我怎样才能做到这一点? 感谢。

3 个答案:

答案 0 :(得分:1)

不使用@mean,而是使用@(x)mean(x,3),正如其他人提到的那样 - ...,'UniformOutput',false

由于计算结果始终具有相同的大小(10x13),因此如果reshape B为向量,则可以将结果单元格转换为数字数组3 rd 维度:

C = cell2mat(reshape(B,1,1,[]));

现在,如果您还想在计算方差时计算方差,则可以这样做

之类的东西
B = cellfun(@(x)cat(3,mean(x,3),var(x,0,3)),A,'UniformOutput',false);

但如果你想把这最后的 B 作为数字数组,你需要在4 th 维度中使它成为一个向量(因为3 rd concatenation)获取:

C = cell2mat(reshape(B,1,1,1,[]));

答案 1 :(得分:0)

cellfun的输出在每个单元格中都不相同,因此您需要编写B = cellfun(@mean,A,'UniformOutput',false)

答案 2 :(得分:0)

我不确定我理解这个问题。我认为你想要的代码序列是:

B = cellfun(@mean,A,'UniformOutput',false);
B = cellfun(@mean,B,'UniformOutput',false);
B = cellfun(@squeeze,B, 'UniformOutput', false);

结果如下:

B =

1×8 cell array

{91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}

我不确定您的数据的上下文是什么,但假设您想要找到整个10x13矩阵的单个方差值,您需要先使用函数var展平矩阵。

for ii=8:-1:1
    flatA{ii} = reshape(A{ii}, 130, 91);
end

V = cellfun(@var, flatA, 'UniformOutput', false);
V = cellfun(@squeeze, V, 'UniformOutput', false);