MATLAB:检测并删除2列矩阵中的镜像对

use*_*496 6 arrays matlab matrix vectorization detect

我有一个矩阵

[1 2
 3 6
 7 1
 2 1]
Run Code Online (Sandbox Code Playgroud)

并希望删除镜像对..输出将是:

[1 2
 3 6
 7 1] 
Run Code Online (Sandbox Code Playgroud)

要么

[3 6
 7 1 
 2 1]
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法吗?我可以想象一个复杂的for循环,类似于(或者一个不会删除原始对的版本......只有重复版本):

for i=1:y
    var1=(i,1);
    var2=(i,2);
    for i=1:y
        if array(i,1)==var1 && array(i,2)==var2 | array(i,1)==var2 && array(i,2)==var1
            array(i,1:2)=[];
        end
    end 
end
Run Code Online (Sandbox Code Playgroud)

谢谢

Div*_*kar 9

简单来说这是怎么回事-

A(~any(tril(squeeze(all(bsxfun(@eq,A,permute(fliplr(A),[3 2 1])),2))),2),:)
Run Code Online (Sandbox Code Playgroud)

在玩code-golf?好吧,我们走了 -

A(~any(tril(pdist2(A,fliplr(A))==0),2),:)
Run Code Online (Sandbox Code Playgroud)

如果只处理两个列矩阵,这里有一个更简单的版本bsxfun-

M = bsxfun(@eq,A(:,1).',A(:,2)); %//'
out = A(~any(tril(M & M.'),2),:)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

A =
     1     2
     3     6
     7     1
     6     5
     6     3
     2     1
     3     4
>> A(~any(tril(squeeze(all(bsxfun(@eq,A,permute(fliplr(A),[3 2 1])),2))),2),:)
ans =
     1     2
     3     6
     7     1
     6     5
     3     4
>> A(~any(tril(pdist2(A,fliplr(A))==0),2),:)
ans =
     1     2
     3     6
     7     1
     6     5
     3     4
Run Code Online (Sandbox Code Playgroud)

  • @randomGuy 3D杂草!;) (6认同)