Arrays 根据Matlab中的值将矩阵拆分为若干个
我有一个单元格数组,我需要把它分成几个矩阵,这样我就可以得到数据子集的和。这是我拥有的一个样本:Arrays 根据Matlab中的值将矩阵拆分为若干个,arrays,matlab,sorting,matrix,split,Arrays,Matlab,Sorting,Matrix,Split,我有一个单元格数组,我需要把它分成几个矩阵,这样我就可以得到数据子集的和。这是我拥有的一个样本: 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'
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,比较第一列中的字符串,然后在循环中创建矩阵,但这听起来很混乱,效率也不高
有更简单的方法吗?的经典用法。您可以使用第一列作为索引,第二列作为与每个索引关联的值accumarray
用于将属于同一索引的值分组在一起,并对这些值应用函数。在您的情况下,您将使用默认行为和sum
一起使用
但是,您需要将第一列转换为数字标签。的第三个输出将帮助您完成此操作。您还需要将第二列转换为数字数组,这是一种完美的方法
不言而喻:
[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及以后版本提供的类。如果没有此功能,您可以使用
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
所以你想按第一列(即M00.x00)对数据进行分组,然后选择每个组的第n个元素并对它们求和?真不错。你赢了我。刚刚开始写accumarray。@rayryeng谢谢!我以前不熟悉accumarray;这正是我所需要的,比我的另一个更有说服力attempts@KellyThomas非常欢迎:)
accumarray
是一个非常漂亮的功能-我最喜欢的功能之一。如果你有时间,我鼓励你多了解一些。你的问题是最好的用例之一。这是一个很好的话题介绍:-祝你好运!