我有这种矩阵:
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
答案 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)