2016-01-20 81 views
6

鏡成像對我具有矩陣MATLAB:檢測和刪除在2列矩陣

[1 2 
3 6 
7 1 
2 1] 

並想刪除鏡成像pairs..i.e。輸出是,要麼:

[1 2 
3 6 
7 1] 

[3 6 
7 1 
2 1] 

有沒有一種簡單的方法來做到這一點?我能想象一個複雜的for循環,喜歡的東西(或不刪除原有pair..only重複的一個版本):

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 

感謝

+1

請注意,您在使用'i'作爲循環索引兩個循環,這是行不通的。我也會反對[使用'i'作爲變量](http://stackoverflow.com/questions/14790740/using-i-and-j-as-variables-in-matlab)。 – Adriaan

回答

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 
+2

你在吸菸的人是什麼! –

+6

@randomGuy 3D雜草! ;) – Divakar

0

這裏,不如此幻想,但希望可以理解和簡單的方法。

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

比較米其翻轉形式,該函數返回ismembermirror_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,:); 

問候