【问题标题】:MATLAB: detect and remove mirror imaged pairs in 2 column matrixMATLAB:检测和删除 2 列矩阵中的镜像对
【发布时间】:2016-01-20 20:27:25
【问题描述】:

我有一个矩阵

[1 2
 3 6
 7 1
 2 1]

并且想删除镜像对..即输出将是:

[1 2
 3 6
 7 1] 

[3 6
 7 1 
 2 1]

有没有简单的方法来做到这一点?我可以想象一个复杂的 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

谢谢

【问题讨论】:

  • 请注意,您使用i 作为两个循环的循环索引,这将不起作用。我也反对using i as a variable

标签: arrays matlab matrix vectorization detect


【解决方案1】:

简单 -

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

在玩code-golf?好吧,我们开始-

A(~any(tril(pdist2(A,fliplr(A))==0),2),:)

如果只处理两列矩阵,这里是bsxfun更简单 版本 -

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

示例运行 -

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

【讨论】:

  • @randomGuy 3D 杂草! ;)
【解决方案2】:

这里不是那么花哨,但希望可以理解和简单的方法。

% Example matrix
m = [1 2; 3 6 ; 7 1; 2 1; 0 3 ; 3 0];

将 m 与其翻转版本进行比较,函数 ismember 返回 mirror_idx,这是一个一维向量,每行包含镜像行的索引,如果没有,则为 0。

[~, mirror_idx] = ismember(m,fliplr(m),'rows');

遍历镜像行的索引。如果您找到一个“镜像”行 (mirror_idx > 0),请将其对应部分设置为“未镜像”。

for ii = 1:length(mirror_idx)
    if (mirror_idx(ii) > 0)
        mirror_idx(mirror_idx(ii)) = 0;
    end
end

只取那些被标记为没有镜像的行。

m_new = m(~mirror_idx,:);

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2011-05-09
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多