MATLAB:检测并删除 2 列矩阵中的镜像对
MATLAB: detect and remove mirror imaged pairs in 2 column matrix
我有一个矩阵
[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
谢谢
简单性如何 -
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
这里有一个不太花哨,但希望易于理解且简单的方法。
% Example matrix
m = [1 2; 3 6 ; 7 1; 2 1; 0 3 ; 3 0];
将 m 与其翻转版本进行比较,函数 ismember
returns mirror_idx
,一个一维向量,每行包含 mirror-row 的索引,或 0如果有 none.
[~, mirror_idx] = ismember(m,fliplr(m),'rows');
浏览 mirror-row 的索引。如果找到 "mirrored" 行 (mirror_idx > 0
),请将其 counter-part 设置为 "not mirrored"。
for ii = 1:length(mirror_idx)
if (mirror_idx(ii) > 0)
mirror_idx(mirror_idx(ii)) = 0;
end
end
只取标记为没有镜像的行。
m_new = m(~mirror_idx,:);
问候
我有一个矩阵
[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
谢谢
简单性如何 -
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
这里有一个不太花哨,但希望易于理解且简单的方法。
% Example matrix
m = [1 2; 3 6 ; 7 1; 2 1; 0 3 ; 3 0];
将 m 与其翻转版本进行比较,函数 ismember
returns mirror_idx
,一个一维向量,每行包含 mirror-row 的索引,或 0如果有 none.
[~, mirror_idx] = ismember(m,fliplr(m),'rows');
浏览 mirror-row 的索引。如果找到 "mirrored" 行 (mirror_idx > 0
),请将其 counter-part 设置为 "not mirrored"。
for ii = 1:length(mirror_idx)
if (mirror_idx(ii) > 0)
mirror_idx(mirror_idx(ii)) = 0;
end
end
只取标记为没有镜像的行。
m_new = m(~mirror_idx,:);
问候