首先我的问题似乎很简单,但我仍然无法找到相应的答案。 所以我的矩阵大小为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
有没有可能让它变得简单,可能是一行还是没有循环?
答案 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),:)
没有bsxfun
或ismember
?嗯......出intersect
,这基本上类似于ismember
-
[~,ind,~] = intersect(a(:,1),b);
out = a(ind,:)