ismember或intersect在matlab中的应用

ismember或intersect在matlab中的应用,matlab,matrix,Matlab,Matrix,我有两个列向量[ab]和[cd]。我只想选择“a”中那些“c”与“a”匹配的数据点,以及相应的“b”值。因为“a”中有一些重复,使得“ismember”命令不能正常工作“For loop”是另一个选项,但列向量的大小太大,无法生成循环。下面给出了一个简单的例子。有解决办法吗?谢谢 [甲、乙] ans= [丁] ans= 你的问题有点不清楚。我假设您期望的输出是: 2.0000 0.2000 2.0000 0.2000 3.0000 0.4000 我对矩阵的定义如下: AB =

我有两个列向量[ab]和[cd]。我只想选择“a”中那些“c”与“a”匹配的数据点,以及相应的“b”值。因为“a”中有一些重复,使得“ismember”命令不能正常工作“For loop”是另一个选项,但列向量的大小太大,无法生成循环。下面给出了一个简单的例子。有解决办法吗?谢谢

[甲、乙]

ans=

[丁]

ans=


你的问题有点不清楚。我假设您期望的输出是:

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

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

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

通过这种方式,您删除了a的所有重复出现,因此现在您可以使用常规方法,如
ismember
intersect
如果
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]
,则需要首先在
a
上调用
unique

[~,idx] = unique(ab(:,1));
ab = ab(idx,:);
out = ab(ismember(ab(:,1),cd(:,1)),:); 

您想要的输出是什么?如果您的代码有working for loop版本,在问题中发布该版本将使每个人都更容易理解您的问题。感谢您的回答,但想要的输出拒绝重复的输出。例如“2.000”应该只出现一次,而不是两次。@user1949014在这种情况下,请显示正确的输出ut作为示例。@userEitanT>>输出第1列2.0000 3.0000第2列0.2000 0。4000@user1949014因此,只需在结果上添加
unique(X,'rows')
。你的意思是b=b(idx)?@Sunil谢谢,反过来确实没什么用。更新了答案。
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
[~,idx] = unique(ab(:,1));
ab = ab(idx,:);
out = ab(ismember(ab(:,1),cd(:,1)),:);