选择一列中的值与特定向量匹配的行

时间:2014-04-03 13:38:10

标签: matlab indexing

首先我的问题似乎很简单,但我仍然无法找到相应的答案。 所以我的矩阵大小为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 

有没有可能让它变得简单,可能是一行还是没有循环?

2 个答案:

答案 0 :(得分: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 :(得分: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),:)

而缩短 -

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

没有bsxfunismember?嗯......出intersect,这基本上类似于ismember -

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