3

我有两个列向量 [ab] 和 [cd]。我只想选择 'a' 中的那些数据点,其中 'c' 匹配 'a' 以及相应的 'b' 值。由于“a”中有一些重复,这使得“ismember”命令无法正常工作。'For loop' 是另一种选择,但列向量的大小对于制作循环来说太大了。下面给出了一个简短的例子。有什么解决办法吗?谢谢

[ab]

答案=

1.0000    0.1000
2.0000    0.2000
2.0000    0.2000
3.0000    0.4000
4.0000    0.5000

[光盘]

答案=

 2     7
 3    12
4

3 回答 3

2

如果我理解正确,解决方案是从以下开始:

[a idx] = unique(a);
b = b(idx);

通过这种方式,您删除了所有重复的 a,因此现在您可以使用常规方法,例如ismemberor intersect

于 2013-01-04T17:36:39.917 回答
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
于 2013-01-04T16:05:08.640 回答
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)),:); 
于 2013-01-04T17:51:38.650 回答