我有两个列向量[a b]和[c d]。我想只选择“a”中'c'与'a'匹配的数据点以及相应的'b'值。因为'a'中有一些重复使得'ismember'命令无法正常工作。 'for loop'是另一种选择,但是列向量的大小对于制作循环来说太大了。下面给出简短的例子。有解决方案吗谢谢
[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 :(得分:2)
如果我理解正确,解决方案是从:
开始[a idx] = unique(a);
b = b(idx);
这样您就删除了a的所有重复出现,现在您可以使用常规方法,例如ismember
或intersect
。
答案 1 :(得分: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
答案 2 :(得分: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]
,则需要先在unique
上调用a
:
[~,idx] = unique(ab(:,1));
ab = ab(idx,:);
out = ab(ismember(ab(:,1),cd(:,1)),:);