0

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

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

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

非常感谢你们的智慧!

4

3 回答 3

2

如果您的意思是对每个单元格条目中的每一行求和,那么您可以执行以下操作:

% 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其中包含跨行的总和。

于 2012-08-17T00:09:49.480 回答
0

这是将每个矩阵的行与一个单元格相加的解决方案,如果您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);
于 2012-08-17T00:24:23.973 回答
0

另一种选择是使用cell2matnum2cell

a=num2cell(randi(10,3)); % random input generation

result = num2cell(sum(cell2mat(a),2));

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

于 2012-08-17T07:12:21.653 回答