Cellfun:如何对矩阵单元格数组中的每一行求和?Matlab
假设我有3x3个单元格,每个单元格包含一个9x9的矩阵,我如何使用cellfun对整个单元格数组的每一行求和 当我尝试使用花括号中的:时,我不断获得错误“坏单元格引用” 我不想把它转换成矩阵,然后再转换成细胞Cellfun:如何对矩阵单元格数组中的每一行求和?Matlab,matlab,sum,cells,Matlab,Sum,Cells,假设我有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),
非常感谢你们的智慧,伙计们 如果您的意思是对每个单元格条目中的每一行求和,那么您可以这样做:
% 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
单元格,其中包含跨行求和。这是使用单元格对每个矩阵行求和的解决方案,如果您仔细阅读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);
另一种选择是使用和:
接下来的问题是:为什么要使用标量的单元矩阵?你不能只使用一个普通的矩阵(你可以使用
cell2mat
)吗?你可以使用NumCell(rand(3))
来生成随机输入。谢谢,但我指的是整个单元格数组中每行的总和@谢谢你!对于每一行,您的意思是为9个数组中的每一个获得单个3x3矩阵的元素式和,即cellfun
等效版本的C=0;对于i=1:9,C=C+(A{i});结束
?@GuntherStruyf的观点很好,但矩阵单元格条目使用了mat2cell
。我为不清楚表示歉意。我想在最后有一个向量,它是整个单元格数组中每一行的总和,就像单元格数组是一个矩阵一样。我试图避免将单元格转换为矩阵,因为我必须将其转换回单元格:)是的,我考虑过这样做,然后再将其转换回单元格,但我的代码的下一部分更好地以单元格形式完成。我认为使用cellfun可能比将一组单元格转换成矩阵然后再转换回一组单元格更快。非常感谢您的帮助。非常感谢,我能够以多种方式对每个单元格中的每个矩阵求和,但我希望对整个单元格数组行求和。这一点我似乎无法理解:)太棒了,谢谢。因此,您将单元阵列拆分为行,然后执行cellfun,从中学习了很多,谢谢!我不是说“我将数组拆分为行”,而是说我将按列方式连接单元格数组每行中的矩阵
a=num2cell(randi(10,3)); % random input generation
result = num2cell(sum(cell2mat(a),2));