在matlab中使用ismember或intersect

时间:2013-01-04 15:52:50

标签: matlab matrix

我有两个列向量[a b]和[c d]。我想只选择“a”中'c'与'a'匹配的数据点以及相应的'b'值。因为'a'中有一些重复使得'ismember'命令无法正常工作。 'for loop'是另一种选择,但是列向量的大小对于制作循环来说太大了。下面给出简短的例子。有解决方案吗谢谢

  
    

[a b]

  

ans =

1.0000    0.1000
2.0000    0.2000
2.0000    0.2000
3.0000    0.4000
4.0000    0.5000
  
    

[c d]

  

ans =

 2     7
 3    12

3 个答案:

答案 0 :(得分:2)

如果我理解正确,解决方案是从:

开始
[a idx] = unique(a);
b = b(idx);

这样您就删除了a的所有重复出现,现在您可以使用常规方法,例如ismemberintersect

答案 1 :(得分:1)

你的问题有点不清楚。我假设你想要的输出是:

2.0000    0.2000
2.0000    0.2000
3.0000    0.4000

我像这样定义了你的矩阵:

AB = [a b];
CD = [c d];

使用ismember:

ismember(AB(:,1), CD(:,1)); % Compare first columns.

会给你行号。像这样:

 0
 1
 1
 1
 0

所以,你需要做的是:

AB(ismember(AB(:,1), CD(:,1)),:); % Get the entire corresponding row.

输出将是:

2.0000    0.2000
2.0000    0.2000
3.0000    0.4000

答案 2 :(得分:1)

如果a的重复值始终与b的值相同,则可以使用ismember的第二个输出作为简单解决方案:

ab=[1.0000    0.1000
2.0000    0.2000
2.0000    0.2000
3.0000    0.4000
4.0000    0.5000];
cd=[2     7
3    12];


[~,idx]=ismember(cd(:,1),ab(:,1))
out = ab(idx,:)

out =

    2.0000    0.2000
    3.0000    0.4000

如果a的重复值有时可能会为b设置不同的值(例如[2 0.2; 2 0.3],则需要先在unique上调用a

[~,idx] = unique(ab(:,1));
ab = ab(idx,:);
out = ab(ismember(ab(:,1),cd(:,1)),:);