2015-11-15 1 views
6

Je voudrais supprimer la diagonale de la matrice suivante;Matlab: Supprimer la diagonale de la matrice et la réforme

[0 1 1 
    0 0 0 
    0 1 0] 

et de mettre cela dans un vecteur tel

[1 1 0 0 0 1] 

Y at-il une fonction d'une façon de le faire? La plupart des autres solutions trouvées sur Stack Overflow suppriment tous les zéros.

+0

Est-ce que ça va toujours être une matrice carrée ou est-ce que les dimensions peuvent être différentes? –

Répondre

7

Si deux lignes sont très bien ...

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

C'est aussi simple que ça! Merci beaucoup! – Jill

+0

Pourquoi la transposer? Je peux voir que cela fonctionne en testant, mais '~ eye' fait un masque sur le' x' d'origine aussi loin que je peux voir. La deuxième ligne de code utilise-t-elle des indices linéaires dans l'ordre des colonnes? – Adriaan

+2

La première transposition est parce que l'OP veut que le résultat renvoie la ligne majeure mais l'indexation avec '~ eye (size (x))' renvoie la colonne major. La deuxième transposition est parce que l'OP veut un vecteur de rangée au lieu d'un vecteur de colonne qui est retourné par le masque logique. – IKavanagh

1

Voici un près d'un paquebot -

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

Je mettrai mon favbsxfun ici -

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

Exemple de passage -

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