2012-09-14 5 views
2

j'ai un tableauSuppression des zéros et des vecteurs concaténer

x = 

    404 1 1 5 5 1 1 5 0 0 0 0 0 0 0 0 0 
    405 2 5 5 4 5 2 5 4 5 3 3 2 5 3 3 0 
    406 5 5 3 5 3 5 4 3 3 1 4 0 0 0 0 0 

Je voudrais supprimer tous les zéros SAUF ceux directement à droite d'un entier non nul. c'est-à-dire tous sauf le dernier zéro d'une rangée d'entiers. (Par exemple, x=x(x~0); supprime simplement les zéros, puis renvoie un vecteur de colonne, ce qui n'est pas tout à fait correct). Concaténez ensuite tous les vecteurs restants.

Comme ceci:

404 1 1 5 5 1 1 5 0 405 2 5 5 4 5 2 5 4 5 3 3 2 5 3 3 0 406 5 5 3 5 3 5 4 3 3 0 4 

Toutes les idées?

Répondre

4

Que diriez-vous

x = x.'; 
dx = x ~= 0; 
dx = dx | circshift(dx, 1) 

y = x(dx).' 

Ainsi, répartis:

  1. trouver les indices logiques aux non-zéros au tableau transposé
  2. de décalage circulairement ce tableau par un et ou il avec les logiques d'origine, pour entrer les zéros directement après les non-zéros
  3. Indexer le tableau avec ces logiques et transposer pour terminer l'opération
+0

C'est vraiment bien! –

+0

Très agréable en effet! Je vous remercie. Pourrait-il piéger 0 intercalé qui existe par erreur humaine dans la saisie de données? – HCAI

+0

@ user1134241 Que voulez-vous dire précisément? Pouvez-vous donner un exemple? –