【问题标题】:applying function to each column of a matrix within a matlab cell array将函数应用于matlab单元数组中矩阵的每一列
【发布时间】:2014-03-03 01:33:16
【问题描述】:

可以使用cellfun 函数在 MATLAB 中将函数应用于元胞数组中的每个矩阵。例如,要确定元胞数组中每个矩阵的中位数,可以发出以下命令:

temp={[1;2;3;4;5] [6;7;8;9;10]}
cellfun(@median,temp)
ans =
    3     8

如何将类似的操作应用于元胞数组的每个元胞内的矩阵的各个列(例如,每个元胞内矩阵的第一列)?对于以下元胞数组,将中值函数应用于每个元胞中矩阵的第一列所需的输出是3,9

temp={[1 2;3 4;5 6] [7 8;9 10;11 12]}

如何编写提供这种输出的操作?最后,如何执行此操作,以便将每个单元格内矩阵第 N 列的输出存储在输出矩阵的第 N 列中?例如,在上面的简化示例中,3,9(矩阵第一列的中位数)将存储在输出矩阵的第一列中;同样,4,10(矩阵第二列的中位数)将存储在输出矩阵的第二列中。为方便起见,单元数组(输入)和所需的中值数组(输出)如下所示:

        cell-1  cell-2
input =  1  2    7  8
         3  4    9 10
         5  6   11 12

output = 3  4
         9 10

谢谢。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    你快到了,只需要重新排列结果元素。

    temp = {[1 2; 3 4; 5 6] [7 8; 9 10; 11 12] [1 2; 3 4; 5 6; 7 8; 9 10]}
    cell2mat(cellfun(@(m) median(m)', temp, 'UniformOutput', false))'
    

    UniformOuptut 选项将cellfun 的输出组合成一个数组。通常median 返回一个行矩阵,其中包含每列的中值,但这里每个行矩阵在与其他输出组合(水平)之前被转置。

    【讨论】:

      【解决方案2】:

      此代码适用于您的小示例 --- 但我不确定如何在没有 for 循环的情况下自动构建矩阵。我相信有人(也许是你!)会知道更好的方法!

      temp={[1 2;3 4;5 6] [7 8;9 10;11 12]}
      C=cellfun(@median,temp,'UniformOutput',false)
      A=[C{1}(1) C{1}(2);C{2}(1) C{2}(2)]
      

      编辑:是的! cyang 知道更好的方法!

      【讨论】:

      • reshape 可用于重新排列输出,例如,A=reshape(cell2mat(C), numel(temp), [])'
      • 直接做更好!没有人喜欢重塑矩阵!
      猜你喜欢
      • 2013-02-23
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多