如何在 matlab 中将函数应用于包含 3D 矩阵的元胞数组中的每个元胞?

How to apply function to each cell in a cell array which contains 3D Matrix in matlab?

我有一个元胞数组 A,维度为 1x8,每个元胞由 10x13xNmatirx(数值)组成。

示例:

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 的向量维度(因为 3rdconcatenation 占用):

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