2015-11-15 21 views
6

Vorrei rimuovere la diagonale della seguente matrice;Matlab: rimuovere la diagonale dalla matrice e riformare

[0 1 1 
    0 0 0 
    0 1 0] 

e mettere questo in un vettore come tale

[1 1 0 0 0 1] 

C'è una funzione one-way per fare questo? La maggior parte delle altre soluzioni che ho trovato su Stack Overflow cancella tutti gli zeri.

+0

È sempre una matrice quadrata o le dimensioni possono essere diverse? –

risposta

7

Se due linee sono bene ...

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

È così semplice! Grazie mille! – Jill

+0

Perché la trasposizione? Vedo che funziona testando, ma il '~ eye' crea una maschera sull'originale' x' per quanto posso vedere. La seconda riga di codice usa indici lineari nell'ordine delle colonne? – Adriaan

+2

La prima trasposizione è perché l'OP vuole che il risultato restituisca la riga principale ma indicizzazione con '~ eye (size (x))' restituisce la colonna maggiore. La seconda trasposizione è perché l'OP vuole un vettore di riga anziché un vettore di colonna restituito dalla maschera logica. – IKavanagh

1

Ecco un quasi one-liner -

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

E mi metterà il mio favbsxfun qui -

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

Esempio di esecuzione -

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