根据来自不同列的第一次出现的数据从列中获取值 - Matlab

时间:2014-05-15 21:17:10

标签: matlab matrix

我有这种矩阵:

m = [randi(20,1,20)', [ones(1,3), ones(1,5)*2, ones(1,8)*3, ones(1,4)*4]']

ans =

     5     1
    19     1
     6     1
    16     2
     4     2
     6     2
     2     2
    12     2
    14     3
    11     3
     9     3
    13     3
    13     3
    14     3
    13     3
    19     3
     5     4
    15     4
     5     4
     3     4

是否有一种有效的方法来提取m(:,1)的值,这些值对应于每个m(:,2)的第一个匹配项? 在我的例子中将是:

 ans =
    5   16   14   5

3 个答案:

答案 0 :(得分:4)

如果第二列已排序(如您的示例所示):

m([true; diff(m(:,2))~=0],1)

答案 1 :(得分:3)

迪瓦卡是老板!在任何情况下,您都可以使用矩阵第二列的unique函数来告诉您第一次出现的位置是您想要的数字。试着这样做:

[~,index] = unique(m(:,2));

第一个输出参数将是一个消除m(:,2)中所有重复项的数组,而index将告诉您每个唯一元素的第一次出现位置。我们不需要第一个参数,这就是我们用~取消它的原因。

因此,index应该是:

index = 
 1
 4
 9
17

然后,您可以通过m(index,1)访问您的值,这样就可以为您提供:

 5
16
14
 5

答案 2 :(得分:3)

我觉得我喜欢跳进这里,我不得不想出点什么,所以就在这里。

<强>代码

binmat1 = bsxfun(@eq,m(:,2),min(m(:,2)):max(m(:,2)))
[~,ind] = max(binmat1(:,any(binmat1)))
out = m(ind)