2014-04-03 50 views
3

首先我的問題看起來很簡單,但我仍然無法找到相關答案。 所以我有矩陣MX4選擇一列中的值與特定向量匹配的行

a = [(2:6)' rand(5,3)] 
a =  
2. 0.1589990 0.2725595 0.2944531 
3. 0.0181815 0.3437655 0.5718074 
4. 0.4098371 0.2033702 0.2141770 
5. 0.0105835 0.3011945 0.6895462 
6. 0.1965310 0.2762596 0.5855573 

的大小和向量b與MX1的大小。 b的元素總是可以在a的第一列找到。例如:

b = [2;3;6] 

我想是選擇行的第一列,其值匹配B的值,即

ans = 
2. 0.1589990 0.2725595 0.2944531 
3. 0.0181815 0.3437655 0.5718074 
6. 0.1965310 0.2762596 0.5855573 

所有我來到這麼遠的這些解決方案:

Ans(1,:) = a(a(:,1)==b(1),:); 
Ans(2,:) = a(a(:,1)==b(2),:); 
Ans(3,:) = a(a(:,1)==b(3),:); 

略有自動化的版本:

Ans = zeros(size(b,1),size(a,2)); 
for i = 1:size(b,1) 
    Ans(i,:)=a(a(:,1)==b(i),:) 
end 

有沒有可能讓它變得簡單,可能在一條線上或沒有循環?

回答

3

這 -

out = a(find(sum(squeeze(any(bsxfun(@eq,a,permute(b,[3 2 1])),2)),2)),:) 

哇,這是一個巨大的東西是不是!

略短 -

out = a(any(squeeze(bsxfun(@eq,a(:,1),permute(b,[3 2 1]))),2),:) 

而且shorterer -

out = a(any(bsxfun(@eq,a(:,1),b'),2),:) 

沒有bsxfunismember? Hmm..try出intersect,即基本上類似於ismember -

[~,ind,~] = intersect(a(:,1),b); 
out = a(ind,:) 
4

我覺得ismember是你的朋友在這裏:

a = [(2:6)' rand(5,3)] 
b = [2;3;6] 

a(ismember(a(:,1),b),:) 
a = 
    2.000000 0.065121 0.172047 0.490842 
    3.000000 0.585701 0.650922 0.260139 
    4.000000 0.266305 0.543419 0.562515 
    5.000000 0.760789 0.378180 0.560597 
    6.000000 0.058769 0.926874 0.538872 

b = 
    2 
    3 
    6 

ans =  
    2.000000 0.065121 0.172047 0.490842 
    3.000000 0.585701 0.650922 0.260139 
    6.000000 0.058769 0.926874 0.538872 

感謝的RTL指出,a(ismember(a,b),:)可能匹配沒有元素在第一列。

+1

+1簡要回答! – Divakar

相關問題