我有一个单元格数组,我需要将其拆分为多个矩阵,以便我可以获取数据子集的总和。这是我的样本:
A = {'M00.300', '1644.07';...
'M00.300', '9745.42'; ...
'M00.300', '2232.88'; ...
'M00.600', '13180.82'; ...
'M00.600', '2755.19'; ...
'M00.600', '15800.38'; ...
'M00.900', '18088.11'; ...
'M00.900', '1666.61'};
我想要“M00.300”,“M00.600”和“M00.900”各自的第二列的总和。例如,要对应'M00.300',我希望1644.07 + 9745.42 + 2232.88。
我不想只是硬代码,因为每个数据集都不同,所以我需要代码适用于不同大小的单元格数组。
我不确定这样做的最佳方法,我将首先循环遍历A并比较第一列中的字符串并在该循环中创建矩阵,但这听起来很混乱而且效率不高。
有更简单的方法吗?
答案 0 :(得分:3)
经典使用accumarray
。您可以将第一列用作索引,将第二列用作与每个索引关联的值。 accumarray
适用于将属于同一索引的值组合在一起并将函数应用于这些值的情况。在您的情况下,您将使用默认行为和sum
一起使用。
但是,您需要将第一列转换为数字标签。 unique
的第三个输出将帮助您完成此操作。您还需要将第二列转换为数字数组,因此str2double
是执行此操作的完美方式。
没有进一步的麻烦:
[val,~,id] = unique(A(:,1)); %// Get unique values and indices
out = accumarray(id, str2double(A(:,2))); %// Aggregate the groups and sum
format long g; %// For better display of precision
T = table(val, out) %// Display on a nice table
我明白了:
>> T = table(val, out)
T =
val out
_________ ________
'M00.300' 13622.37
'M00.600' 31736.39
'M00.900' 19754.72
以上使用R2013b及以后版本提供的table
类。如果你没有这个,你可以使用for
循环并分别打印每个单元格和值:
for idx = 1 : numel(out)
fprintf('%s: %f\n', val{idx}, out(idx));
end
我们得到:
M00.300: 13622.370000
M00.600: 31736.390000
M00.900: 19754.720000