让我难过的简单问题。
我有一个二维值矩阵;
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时出错 连接的矩阵的尺寸不一致。"
答案 0 :(得分:4)
你很亲密。您可以利用x
中包含的值是您要在accumarray
中使用的下标这一事实,然后是指定正确的输出大小。在这种情况下,x
中的唯一值的数量。
让我们定义x
,y
和x_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
而不是原始数据,然后您可以在
x_y = [x y];