【问题标题】:Cellfun : How to sum each row in a cell array of matrices? MatlabCellfun:如何对矩阵单元数组中的每一行求和? MATLAB
【发布时间】:2012-08-13 09:12:34
【问题描述】:

假设我有 3x3 个单元格,每个单元格包含一个 9x9 的矩阵,我将如何使用 cellfun 对整个单元格数组的每一行求和?

当我尝试在大括号中使用 : 时,我不断收到错误“错误的单元格引用”。

我宁愿不将其转换为矩阵,然后再次转换回单元格。

非常感谢你们的智慧!

【问题讨论】:

    标签: matlab sum cells


    【解决方案1】:

    如果你的意思是对每个单元格条目中的每一行求和,也许你可以这样做:

    % random input
    A = cell(3,3);
    for i=1:9
        A{i} = randi(9,3,3);
    end;
    
    B = cellfun(@(x) sum(x, 2), A, 'UniformOutput', false);
    

    更新:要对单元格数组中的所有行求和,就好像它是一个矩阵一样,而不转换为矩阵,将上述修改为:

    B = num2cell(zeros(3, 1)); % initialize
    for i=1:3
        B = cellfun(@plus, B, A(:,i), 'UniformOutput', false); % add column-wise
    end
    B = cellfun(@(x) sum(x, 2), B, 'UniformOutput', false); % add within each remaning cell
    

    这将给出3x1 数组的3x1 单元格,其中包含各行的总和。

    【讨论】:

    • 您可以使用num2cell(rand(3)) 来生成随机输入
    • 啊,谢谢,但我的意思是整个单元阵列中每一行的总和!
    • @Tetra 谢谢! 每一行你的意思是为 9 个数组中的每一个获得一个元素总和的单个 3x3 矩阵,即 cellfun 等效版本的 C=0; for i=1:9, C = C + (A{i}); end?
    • @GuntherStruyf 好点,mat2cell 虽然用于矩阵单元格条目。
    • 我很抱歉不清楚。我想要一个最后的向量,它是整个单元阵列中每一行的总和,就好像单元阵列是一个矩阵一样。我试图避免将单元格转换为矩阵,因为我必须将其转换回单元格:)
    【解决方案2】:

    这里是每个矩阵的行和一个单元格相加的解决方案,如果你仔细阅读cellfun的文档,我想你应该可以得到它。

    clc;
    clear all;
    a=cell(3,3);
    for i=1:3
        for j=1:3
            a{i,j}=randi(10,[9 9]);
        end
    end
    
    row_sum_cell=cellfun(@(a) sum(a,2),a,'UniformOutput',false);
    

    以下解决方案对元胞数组中的整行求和:

    clc;
    clear all;
    a=cell(3,3);
    for i=1:3
        for j=1:3
            a{i,j}=randi(10,[9 9]);   %generating the cell array
        end
    end
    
    [r,c]=size(a);          %getting the size of the array to concatenate it at runtime
    horzCat_A=cell(r,1);
    
    for i=1:r
        for j=1:c
            horzCat_A{i,1}=[horzCat_A{i,1} a{i,j}];    %concatenating
        end
    end
    
    %after getting a concatenated matrix, apply a cellfun same as in previous example.
    cell_row_sum=cellfun(@(horzCat_A) sum(horzCat_A,2),horzCat_A,'UniformOutput',false);
    

    【讨论】:

    • 非常感谢,我能够以多种方式对每个单元格中的每个矩阵求和,但我希望对单元格数组中的整个行求和。我似乎无法弄清楚: )
    • 太棒了,谢谢。所以你把元胞数组分成几行,然后执行 cellfun,从中学到了很多,谢谢!
    • 我不会说“我将数组拆分为行”,而是说我将每行单元格数组中的矩阵逐列连接
    【解决方案3】:

    另一种选择是使用cell2matnum2cell

    a=num2cell(randi(10,3)); % random input generation
    
    result = num2cell(sum(cell2mat(a),2));
    

    接下来的问题是:为什么要使用标量单元矩阵?您不能只使用普通矩阵(可以使用cell2mat 获得)吗?

    【讨论】:

    • 是的,我考虑过这样做,然后将其重新转换回单元格,但我的代码的下一部分以单元格形式完成要好得多。我认为使用 cellfun 而不是将单元格数组转换为矩阵然后再转换回单元格数组可能会更快。非常感谢您的帮助。
    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多