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

Matlab 单个x值的多个y值,如何找到最大y值,matlab,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),[

这是一个让我困惑的简单问题

我有一个二维的值矩阵

 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时出错
被连接的矩阵的维数不一致。”

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

让我们定义
x
y
x\u 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

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

让我们定义
x
y
x\u 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

仍然是一条路要走。我假设
x
的值仍然完全相同,在这种情况下,只需执行以下操作:

x_unique = unique(x);
x_ind = 1:length(x_unique);
x_unique
选择
x
数组中所有完全相等的值。如果它们不完全相等(1.0001~=1.0000 eg),这将不起作用,您将不得不对数组进行四舍五入。因此,如果您有和数组
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\u unique(x\u ind)

这将为您提供一个整数索引数组,稍后可以使用
x\u unique(x\u ind)
将其跟踪回原始值x。 将阵列切换为使用
x_ind
而不是原始阵列,然后您可以在

x_y = [x y];
这仍然是一条路要走。我假设
x
的值仍然完全相同,在这种情况下,只需执行以下操作:

x_unique = unique(x);
x_ind = 1:length(x_unique);
x_unique
选择
x
数组中所有完全相等的值。如果它们不完全相等(1.0001~=1.0000 eg),这将不起作用,您将不得不对数组进行四舍五入。因此,如果您有和数组
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\u unique(x\u ind)

这将为您提供一个整数索引数组,稍后可以使用
x\u unique(x\u ind)
将其跟踪回原始值x。 将阵列切换为使用
x_ind
而不是原始阵列,然后您可以在

x_y = [x y];

你好太快了!我的问题可能太笼统了。如果您的x值(1)不是整数(但可以四舍五入而不会造成太多精度损失),并且(2)并非总是由相等的值隔开,您会怎么做?这样你就不能利用索引的步进。@bobby brains在这种情况下做
[~,~,x2]=unique(x)
x
值减少为整数,然后使用
x2
代替
x
,即定义
x_y=[x2 y]
然后呼叫AccumarayHi。太快了!我的问题可能太笼统了。如果您的x值(1)不是整数(但可以四舍五入而不会造成太多精度损失),并且(2)并非总是由相等的值隔开,您会怎么做?这样你就不能利用索引的步进。@bobby brains在这种情况下做
[~,~,x2]=unique(x)
x
值减少为整数,然后使用
x2
代替
x
,即定义
x_y=[x2 y]
然后致电
Accumaray
感谢您的输入A。您必须原谅我一点,因为我没有完全听懂。我不太明白x_ind的输出意味着什么。谢谢你的输入A。你必须原谅我一点,因为我没有完全理解。我不太明白x_ind的输出意味着什么。