【问题标题】:Finding value and index of min value in a matrix, grouped by column values [closed]在矩阵中查找最小值的值和索引,按列值分组[关闭]
【发布时间】:2013-05-20 14:21:08
【问题描述】:

我正在尝试使用 matlab 在以下矩阵中找到每组数据点的最小值和索引

    a=[0.3 1;
    0.5 1;
    0.2 1;
    0.4 2 ;
    0.43 2;
    0.01 3;
    0.3 3;
    0.23 3];

数据按第 2 列中的值分组。即前三行在第 1 组中,接下来的两行在第 2 组中,最后 3 行在第 3 组中。

谢谢

【问题讨论】:

  • 到目前为止,您尝试过什么,我假设您尝试过遍历矩阵并为每个组数保持最小值?你有应用它的问题吗?还是您正在寻找更好的解决方案?
  • 是的,我试过这个解决方案。我遇到的问题是位置/索引,因为我得到的索引是每个组中的位置或顺序不在主矩阵内。
  • 请参阅:stackoverflow.com/questions/15588466/… 以及许多其他类似的问题...

标签: matlab


【解决方案1】:

使用accumarraymin 找出每组的最小值:

v = accumarray( a(:,2), a(:,1), [], @min )

要获得最小值的索引,请构造行:

idx = find(ismember(a, [v, unique(a(:, 2))], 'rows'))

另外,如果您有m 预定组,您可以使用(1:m)' 代替unique(...)

【讨论】:

  • 我不熟悉使用 accumarray,不过谢谢。但是,是否有其他方法可以这样做,因为该组没有。最多可以是 m 个值 (1, 2, 3, ..., m)。
  • @LindaRabady 你真的应该熟悉accumarray,如果你想在 MATLAB 上做得更好。
  • @LindaRabady 我已经更新了 Shai 的解决方案以获得您正在寻找的那些索引。
  • @EitanT 非常感谢代码,我已经尝试过了,这正是我需要的。它绝对比 for 循环快,并且在主矩阵中给出索引而不是在每个组内。
  • @EitanT 完成!谢谢
【解决方案2】:

另一种选择:

 min(a(a(:,2)==1))
 min(a(a(:,2)==2)) % etc...

只要第二列中的数字是整数就应该有效,否则相等性测试将失败。如果使用双精度值,请将值之间的差异与(非常)小的公差(例如 1e-6)进行比较。

【讨论】:

  • 非常感谢,这对我来说是一个更好的选择。它们是整数
  • 如何获取每个最小值的位置?
  • 使用两个输出参数调用min函数:>> [min_val,idx] = min(a(a(:,2)==1))min_val = 0.20000idx = 3
  • @am304 这个解决方案根本没有效率,因为它对数据进行了多次冗余迭代。此外,要完全自动化此解决方案,应提前检测唯一值,这会进一步增加解决方案不必要的复杂性。
  • 谢谢,是的,但这会给我组本身(如组 1)中的索引,而不是 a 矩阵中的索引。这个我已经试过了。
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多