在MatLab中确定两个矩阵中是否有重复行

在MatLab中确定两个矩阵中是否有重复行,matlab,duplicates,Matlab,Duplicates,问题简介: 我正在建模一个系统,其中我有一个矩阵X=([0,0,0];[0,1,0],…),其中每一行代表三维空间中的一个点。然后,我选择一个随机的行r,然后取下面所有的行,围绕r表示的点旋转,并从这些行X_rot生成一个新的矩阵。我现在想检查X_rot中的任何行是否等于X的任意两行(即,两个顶点相互重叠),如果是这种情况,请拒绝旋转并重试 实际问题: 到目前为止,我使用了以下代码: X_sim=[X;X_rot]; if numel(unique(X_sim,'rows'))==numel(X

问题简介:

我正在建模一个系统,其中我有一个矩阵X=([0,0,0];[0,1,0],…),其中每一行代表三维空间中的一个点。然后,我选择一个随机的行r,然后取下面所有的行,围绕r表示的点旋转,并从这些行X_rot生成一个新的矩阵。我现在想检查X_rot中的任何行是否等于X的任意两行(即,两个顶点相互重叠),如果是这种情况,请拒绝旋转并重试

实际问题:

到目前为止,我使用了以下代码:

X_sim=[X;X_rot];
if numel(unique(X_sim,'rows'))==numel(X_sim);
    X(r+1:N+1,:,:)=X_rot;
end
这是可行的,但它占用了我50%以上的运行时间,我正在考虑这里是否有人知道一种更有效的方法,因为我不需要从
unique
获得的所有信息

另外,如果这很重要,那么我通常在
X
中有100到1000行

致以最良好的祝愿, 莫顿

附加: 我的
x
-矩阵包含N+1行,我有12种不同的旋转操作,可以应用于子矩阵x\u rot:

step=ceil(rand()*N);
r=ceil(rand()*12);
x_rot=x(step+1:N+1,:);
x_rot=bsxfun(@minus,x_rot,x(step,:));
x_rot=x_rot*Rot(:,:,:,r);
x_rot=bsxfun(@plus,x_rot,x(step,:));
两种可能的方法(我不知道它们是否比使用
unique
更快):

  • 使用:

  • 使用:


  • result
    1
    如果有一行
    X
    等于某行
    X\u rot
    ,否则
    0

    ismember(X\u rot,X,'rows')如何

    在计算
    X_rot
    的地方共享代码?在我的情况下,您对
    bsxfun
    的建议在
    unique
    的70%时间内运行,因此有了显著的改进。非常感谢,你为我节省了很多时间。你说的“相同的索引行”是什么意思?比如,它将
    X_-rot(1,:)
    X(1,:)
    X_-rot(2,:)
    X(2,:)
    ,等等进行比较?在这种情况下,no–在功能上,
    ismember(A,B)
    将获取
    A
    中的每一行,并搜索
    B
    中的所有行,直到找到匹配项,或在未找到匹配项的情况下耗尽
    B
    中的所有行。我需要它告诉我
    x
    中是否包含
    x
    的任何元素。如果我理解
    ismember
    正确,则仅当所有
    x_-rot
    的元素包含在
    x
    中?否。
    ismember
    将返回一个逻辑和索引向量,指示
    x_-rot
    的每个元素或行是否包含在
    x
    中,如果包含在哪里。例如,如果
    x_rot
    的长度为125行,那么
    [tf,ix]=ismember(x_rot,x,'rows')
    将为
    tf
    返回一个125长的逻辑,为
    ix
    返回一个125长的双索引,并且
    x_rot(tf,:)
    将为您提供与
    x
    中的行重复的所有行。否,抱歉,没有正确阅读文档。但是在我的实现中,它比独特的方法慢。但是谢谢你的邀请feedback@AndrewJanke你说得对。我是那个意思,但现在我明白我错了。很抱歉搞混了+1对于这种方法
    d = pdist2(X, X_rot, 'hamming'); %// 0 if rows are equal, 1 if different.
    %// Any distance function will do, so try those available and choose fastest
    result = any(d(:)==0);
    
    d = squeeze(any(bsxfun(@ne, X, permute(X_rot, [3 2 1])), 2));
    result = any(d(:)==0);