我有一个单元格数组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的均值和方差。 我怎样才能做到这一点? 感谢。
答案 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);