【问题标题】:Split matrix into several depending on value in Matlab根据 Matlab 中的值将矩阵拆分为多个
【发布时间】:2015-11-03 16:30:18
【问题描述】:

我有一个单元格数组,我需要将其拆分为几个矩阵,以便获取数据子集的总和。这是我所拥有的样本:

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 并比较第一列中的字符串并在该循环中创建矩阵,但这听起来很混乱且效率不高。

有没有更简单的方法来做到这一点?

【问题讨论】:

  • 所以你想按第一列(即M00.x00)对数据进行分组,然后选择每组的第N个元素并求和?

标签: arrays matlab sorting matrix split


【解决方案1】:

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

【讨论】:

  • 不错的一个。你打败了我。刚刚开始写 accumarray。
  • @rayryeng 谢谢!我以前不熟悉 accumarray ;这正是我所需要的,比我的其他尝试更有说服力
  • @KellyThomas 不客气 :) accumarray 是一个非常漂亮的函数——我的最爱之一。如果你有时间,我鼓励你更多地了解它。您的问题是它的最佳用例之一。这是对该主题的一个很好的温和介绍:blogs.mathworks.com/loren/2008/02/20/… - 祝你好运!
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多