我有一个矩阵
[1 2
3 6
7 1
2 1]
并想要删除镜像对..i.e。输出将是:
[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
感谢
答案 0 :(得分:9)
这对于简单 -
是怎样的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
答案 1 :(得分:0)
这里不是那么花哨,但希望可以理解和简单的方式。
% Example matrix
m = [1 2; 3 6 ; 7 1; 2 1; 0 3 ; 3 0];
将m与其翻转版本进行比较,函数ismember
返回mirror_idx
,一个1D向量,每行包含镜像行的索引,如果没有则为0。
[~, mirror_idx] = ismember(m,fliplr(m),'rows');
浏览镜像行的索引。如果你发现一个"镜像" row(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,:);
问候