【发布时间】:2012-08-13 09:12:34
【问题描述】:
假设我有 3x3 个单元格,每个单元格包含一个 9x9 的矩阵,我将如何使用 cellfun 对整个单元格数组的每一行求和?
当我尝试在大括号中使用 : 时,我不断收到错误“错误的单元格引用”。
我宁愿不将其转换为矩阵,然后再次转换回单元格。
非常感谢你们的智慧!
【问题讨论】:
假设我有 3x3 个单元格,每个单元格包含一个 9x9 的矩阵,我将如何使用 cellfun 对整个单元格数组的每一行求和?
当我尝试在大括号中使用 : 时,我不断收到错误“错误的单元格引用”。
我宁愿不将其转换为矩阵,然后再次转换回单元格。
非常感谢你们的智慧!
【问题讨论】:
如果你的意思是对每个单元格条目中的每一行求和,也许你可以这样做:
% 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)) 来生成随机输入
cellfun 等效版本的 C=0; for i=1:9, C = C + (A{i}); end?
mat2cell 虽然用于矩阵单元格条目。
这里是每个矩阵的行和一个单元格相加的解决方案,如果你仔细阅读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);
【讨论】: