将函数应用于matlab单元阵列中的矩阵的每列

时间:2014-03-03 01:33:17

标签: matlab

使用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

谢谢。

2 个答案:

答案 0 :(得分:3)

你几乎就在那里,只需要重新排列结果元素。

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返回一个包含每列中值的行矩阵,但是这里每个行矩阵在与其他输出组合(水平)之前进行转置。

答案 1 :(得分: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 知道更好的方法!