确定MatLab中两个矩阵中是否有任何重复的行

时间:2014-03-24 14:29:08

标签: matlab duplicates

问题简介:

我建模了一个系统,其中我有一个矩阵X =([0,0,0]; [0,1,0],...),其中每一行代表一个3D空间中的一个点。然后,我选择一个随机行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%的运行时间,而且我在考虑是否有人在这里知道更有效的方法,因为我不需要我从{获得的所有信息{1}}。

P.S。如果它很重要,那么我通常在unique中有100到1000行。

祝你好运, 的Morten

其他 我的X - 矩阵包含N + 1行,我有12种不同的旋转操作,可以应用于子矩阵x_rot:

x

2 个答案:

答案 0 :(得分:2)

两种可能的方法(我不知道它们是否比使用unique更快):

  1. 使用pdist2

    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);
    
  2. 使用bsxfun

    d = squeeze(any(bsxfun(@ne, X, permute(X_rot, [3 2 1])), 2));
    result = any(d(:)==0);
    
  3. 如果有result行等于1的某一行,则{p> XX_rot,否则为0

答案 1 :(得分:1)

ismember(X_rot, X, 'rows')怎么样?