单个x值的多个y值,如何找到最大y值

时间:2015-08-14 12:40:48

标签: matlab

让我难过的简单问题。

我有一个二维值矩阵;

 x     y
 1     1.568
 2     2.457
 2     7.778
 3     5.124
 1     7.985
 2     6.025
 3     3.505

有一个重复的x值,[1 2 3]和相应的y值。

我想从每个唯一的x值中提取最大y值。

我尝试过各种各样的东西,但没有运气。我得到的最接近的是使用;

x_y = [unique(x_y(:,1)),accumarray(x_y(:,1),x_y(:,2),[],@max)]

但我有这个错误; "使用horzcat时出错 连接的矩阵的尺寸不一致。"

2 个答案:

答案 0 :(得分:4)

你很亲密。您可以利用x中包含的值是您要在accumarray中使用的下标这一事实,然后是指定正确的输出大小。在这种情况下,x中的唯一值的数量。

让我们定义xyx_y

x = [1;2;2;3;1;2;3]
y = [1.568;2.457;7.778;5.124;7.985;6.025;3.505]

x_y = [x y]


m = accumarray(x_y(:,1),x_y(:,2),[numel(unique(x_y(:,1))) 1],@max)
m =

    7.9850
    7.7780
    5.1240

耶!

答案 1 :(得分:2)

Benoit's solution仍然是要走的路。我假设您仍然拥有x完全相同的值,在这种情况下只需执行:

x_unique = unique(x);
x_ind = 1:length(x_unique);

x_unique选择x数组的所有完全相等的值。如果它们不完全相同(例如1.0001~ = 1.0000),这将无法工作,无论如何您都必须对阵列进行舍入。所以,如果你有和数组x

x = [1,2,3,3,4,5,5,6,7]
unique(x) = [1,2,3,4,5,6,7]

命令unique正如其名称所暗示的那样:将所有唯一条目返回到数组中。如果现在数组是非整数数组,unique将返回那些非整数值。如果我没弄错accumarray根据第一个参数创建一个网格,那么它们必须是整数。要确保x的所有唯一值都获得分配给它们的相同整数值,您可以创建一个数组x_ind = 1:length(x_unique),它为您提供一个与您在其中具有唯一值的整数完全一样的数组。原x。这基本上意味着为x的每个唯一值分配了一个整数值,可以由accumarray处理。 之后,您的最大值将位于矩阵中,该矩阵看起来像在Benoit的示例中,其中排序是增加的整数。但是,该整数只是您实际x值的占位符,即x_unique(x_ind)所需的值。

这为您提供了一个整数索引数组,稍后可以使用x_unique(x_ind)将其追溯到x的原始值。 将数组切换为使用x_ind而不是原始数据,然后您可以在

中选择Benoit的代码
x_y = [x y];