Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 根据Matlab中的值将矩阵拆分为若干个_Arrays_Matlab_Sorting_Matrix_Split - Fatal编程技术网

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
是一个非常漂亮的功能-我最喜欢的功能之一。如果你有时间,我鼓励你多了解一些。你的问题是最好的用例之一。这是一个很好的话题介绍:-祝你好运!