2013-01-04 41 views
3

我有两个列向量[a b]和[c d]。我只想选择'a''c'与'a'匹配的数据点以及相应的'b'值。因为'a'中有一些重复使'ismember'命令不能正常工作。 'For循环'是另一种选择,但是列向量的大小对于循环来说太大了。下面给出简短的例子。任何解决方案感谢使用ismember或matlab相交

[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 
+0

什么是你想要的输出 – HebeleHododo

+0

如果您有工作的for循环版本的代码,在问题中发布该代码会让每个人都更容易理解您的问题。 – KlausCPH

回答

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 
+0

感谢您的回答,但期望的输出拒绝重复。像'2。000'应该只有一次而不是两次。 – Umar

+0

@ user1949014在这种情况下,请为您的示例显示正确的输出。 –

+0

@userEitanT >>输出 第1列2.0000 3.0000 第2列0.2000 0.4000 – Umar

2

如果我理解正确的解决办法是开始:

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

这样你全部删除重复出现的,所以现在你可以使用你的常规方法,如ismemberintersect

+1

你的意思是b = b(idx)? –

+0

@Sunil谢谢,反过来确实不会做太多。更新了答案。 –

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],你需要调用uniquea第一:

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