如何在 matlab 中将函数应用于包含 3D 矩阵的元胞数组中的每个元胞?
How to apply function to each cell in a cell array which contains 3D Matrix in matlab?
我有一个元胞数组 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个值表示点数,第三个值表示位置。
当我尝试使用 cellfun
函数对具有与上述相同维度和单元格值的 1x8 单元格数组应用均值时,出现以下错误。
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 的均值和方差。
我怎样才能做到这一点?
谢谢。
cellfun
的输出在每个单元格中都不一样,所以你需要写成B = cellfun(@mean,A,'UniformOutput',false)
。
我不确定我是否理解问题。我认为你想要的代码序列是:
B = cellfun(@mean,A,'UniformOutput',false);
B = cellfun(@mean,B,'UniformOutput',false);
B = cellfun(@squeeze,B, 'UniformOutput', false);
这里的结果是:
乙=
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);
而不是使用 @mean
,使用 @(x)mean(x,3)
,正如其他人提到的那样 - ...,'UniformOutput',false
.
由于计算结果始终具有相同的大小 (10x13
),您可以将结果单元格转换为数值数组,如果您 reshape
B
是第 3rd 维向量:
C = cell2mat(reshape(B,1,1,[]));
现在,如果您还想计算方差,您可以这样做
像
B = cellfun(@(x)cat(3,mean(x,3),var(x,0,3)),A,'UniformOutput',false);
但是如果你想把最后一个 B 作为一个数值数组,你需要把它变成第 4th 的向量维度(因为 3rd 被 concatenation 占用):
C = cell2mat(reshape(B,1,1,1,[]));
我有一个元胞数组 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个值表示点数,第三个值表示位置。
当我尝试使用 cellfun
函数对具有与上述相同维度和单元格值的 1x8 单元格数组应用均值时,出现以下错误。
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 的均值和方差。 我怎样才能做到这一点? 谢谢。
cellfun
的输出在每个单元格中都不一样,所以你需要写成B = cellfun(@mean,A,'UniformOutput',false)
。
我不确定我是否理解问题。我认为你想要的代码序列是:
B = cellfun(@mean,A,'UniformOutput',false);
B = cellfun(@mean,B,'UniformOutput',false);
B = cellfun(@squeeze,B, 'UniformOutput', false);
这里的结果是:
乙=
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);
而不是使用 @mean
,使用 @(x)mean(x,3)
,正如其他人提到的那样 - ...,'UniformOutput',false
.
由于计算结果始终具有相同的大小 (10x13
),您可以将结果单元格转换为数值数组,如果您 reshape
B
是第 3rd 维向量:
C = cell2mat(reshape(B,1,1,[]));
现在,如果您还想计算方差,您可以这样做 像
B = cellfun(@(x)cat(3,mean(x,3),var(x,0,3)),A,'UniformOutput',false);
但是如果你想把最后一个 B 作为一个数值数组,你需要把它变成第 4th 的向量维度(因为 3rd 被 concatenation 占用):
C = cell2mat(reshape(B,1,1,1,[]));