Matlab 根据包含数字数据作为字符串的行索引对子矩阵求和
如何对单元格子部分的每列求和 给定一个单元格aMatlab 根据包含数字数据作为字符串的行索引对子矩阵求和,matlab,vectorization,Matlab,Vectorization,如何对单元格子部分的每列求和 给定一个单元格a A = {'a' '546.8' '543.5' '544' 'a' '641.9' '637.4' '632.3' 'a' '214.7' '214.1' '231.8' 'a' '256.9' '255.6' '254.2' 'c' '356' '355.1' '354.4' 'c' '759' '759.6' '756.2' 'c' '352.2' '350.4'
A = {'a' '546.8' '543.5' '544'
'a' '641.9' '637.4' '632.3'
'a' '214.7' '214.1' '231.8'
'a' '256.9' '255.6' '254.2'
'c' '356' '355.1' '354.4'
'c' '759' '759.6' '756.2'
'c' '352.2' '350.4' '350.8'
'f' '234' '230.3' '232.3'
'f' '225' '223.5' '221.8'}
根据A.第一列中的不同字母将A分为子单元格,并对子单元格的每列求和
预期结果是:
B = {'a' '1660.3' '1650.6' '1662.3'
'c' '1467.2' '1465.1' '1461.4'
'f' '459' '453.8' '454.1'}
可能的解决办法之一是
[B,~,idxs]= unique(A(:,1))
for k=2:size(A,2)
B(:,k)= num2cell(accumarray(idxs,str2double(A(:,k))))
end
不需要循环:
%// get unique rows
[ids,~,subs] = unique(A(:,1))
%// transform string data to numeric data
vals = str2double(A(:,2:end))
%// sum unique rows
sums = accumarray(subs, 1:numel(subs), [], @(x) {sum(vals(x,:),1)} )
%// output result
out = [ids(:),num2cell(cell2mat(sums))]
为什么要将数字保留为字符串?单元格数组可以包含混合数据类型。我保持它与从excel导入的数据类型相同。