2015-11-15 24 views
6

Tôi muốn loại bỏ đường chéo của ma trận sau;Matlab: Xóa đường chéo khỏi ma trận và cải cách

[0 1 1 
    0 0 0 
    0 1 0] 

và đặt điều này trong một vector như vậy

[1 1 0 0 0 1] 

Có một chức năng một cách để làm điều này? Hầu hết các giải pháp khác tôi tìm thấy trên Stack Overflow xóa tất cả các số không.

+0

Nó luôn luôn là một ma trận vuông hoặc có thể là kích thước khác nhau? –

Trả lời

7

Nếu hai dòng đều ổn ...

x = x.'; %'// transpose because you want to work along 2nd dimension first 
result = x(~eye(size(x))).'; %'// index with logical mask to remove diagonal 
+0

Nó đơn giản như vậy! Cảm ơn bạn rất nhiều! – Jill

+0

Tại sao chuyển vị? Tôi có thể thấy rằng nó hoạt động bằng cách kiểm tra, nhưng '~ eye' làm cho một mặt nạ trên bản gốc' x' như xa như tôi có thể nhìn thấy. Dòng thứ hai của mã có sử dụng các chỉ số tuyến tính theo thứ tự cột lớn không? – Adriaan

+2

Chuyển vị đầu tiên là vì OP muốn kết quả trả về hàng chính nhưng lập chỉ mục với '~ eye (size (x))' trả về cột chính. Chuyển vị thứ hai là vì OP muốn một vectơ hàng thay vì một vectơ cột được trả về bởi mặt nạ logic. – IKavanagh

1

Dưới đây là một gần một liner -

[m,n] = size(x); 
x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable')) 

Và tôi sẽ đưa lên fav của tôibsxfun đây -

xt = x.'; %//' 
[m,n] = size(x); 
out = xt(bsxfun(@ne,(1:n)',1:m)).' 

Chạy mẫu -

>> x 
x = 
    52 62 37 88 
    23 68 98 91 
    49 40  4 79 
>> [m,n] = size(x); 
>> x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable')) 
ans = 
    62 37 88 23 98 91 49 40 79 
>> xt = x.'; 
>> xt(bsxfun(@ne,(1:n)',1:m)).' 
ans = 
    62 37 88 23 98 91 49 40 79 
Các vấn đề liên quan