2013-01-04 42 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)),:);