2016-01-20 20 views
6

Tôi có một ma trậnMATLAB: phát hiện và loại bỏ gương cặp chụp ảnh trong ma trận 2 cột

[1 2 
3 6 
7 1 
2 1] 

và muốn loại bỏ gương chụp pairs..i.e. đầu ra sẽ là một trong hai:

[1 2 
3 6 
7 1] 

hoặc

[3 6 
7 1 
2 1] 

Có một cách đơn giản để làm điều này? Tôi có thể tưởng tượng một phức tạp đối với vòng lặp, một cái gì đó tương tự (hoặc một phiên bản đó sẽ không xóa bản gốc pair..only các bản sao):

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 

nhờ

+1

Lưu ý rằng bạn đang sử dụng 'i' như một chỉ số vòng lặp cho cả hai vòng, mà sẽ không hoạt động. Tôi cũng lập luận cảnh cáo chống lại [sử dụng 'i' như một biến] (http://stackoverflow.com/questions/14790740/using-i-and-j-as-variables-in-matlab). – Adriaan

Trả lời

9

thế nào là điều này cho đơn giản -

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

Phát code-golf? Vâng, ở đây chúng tôi đi -

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

Nếu đối phó với hai ma trận cột duy nhất, đây là một phiên bảnđơn giản hơn bsxfun -

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

mẫu chạy -

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

Bạn hút thuốc gì! –

+6

@randomGuy 3D cỏ dại! ;) – Divakar

0

Dưới đây là một không rất lạ mắt, nhưng rất dễ hiểu và dễ hiểu.

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

So sánh m với phiên bản lật của nó, chức năng ismember lợi nhuận mirror_idx, một 1D-vector với mỗi hàng chứa các chỉ số của các gương hàng, hoặc 0 nếu có ai sánh kịp.

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

Đi qua các chỉ số của hàng phản chiếu. Nếu bạn tìm thấy một hàng "được nhân đôi" (mirror_idx > 0), hãy đặt bộ phận truy cập của nó thành "không được nhân đôi".

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

Chỉ lấy các hàng được đánh dấu là không có gương.

m_new = m(~mirror_idx,:); 

Greetings

Các vấn đề liên quan