2014-06-13 2 views
5

Quelqu'un peut-il expliquer pourquoi dans l'exemple A le résultat est le vecteur 1x6 (ce qui est logique et était ce que je m'attendais) alors que dans l'exemple B le résultat est le vecteur 1x4?Indexation en vecteur

Dans l'exemple B si je prédéfinis la taille de newvec pour être un vecteur 1x6, le résultat est le vecteur 1x6 correct. Juste ne pas comprendre ce qui se passe.

Exemple A

vec = [0 2 3 0 5 0]  %1x6 
newvec(vec == 0) = 1 %produces a 1 x 6 vector 

Exemple B

vec = [0 2 3 0 5 3]  %1 x 6 
newvec(vec == 0) = 1 %produces a 1 x 4 vector 
+0

votre exemple n'a pas de sens. Veuillez ajouter le code correct pour le problème que vous avez. le code que vous avez ajouté donne toujours un vecteur 1x6 – ASantosRibeiro

+1

@ASantosRibeiro: pas si vous émettez 'clear newvec' avant chaque exemple :) –

+1

+1 question intéressante. Les réponses vous donnent une idée de ce qui se passe, mais juste pour ajouter quelque chose. Si vous n'avez pas de vecteur dans l'espace de travail et que vous le créez en assignant par exemple 'A (5) = 1' (où' A' n'existait pas auparavant), matlab créera A assez grand pour mettre '1 'dans le 5ème élément et remplissez le reste avec des zéros. Essayez-le. Vous pouvez également développer une matrice de cette façon, par exemple 'x = 1: 5; x (10) = 1', essayez cela et vous devriez le voir remplir les éléments 6 à 9 avec des zéros. Je suppose que vous pourriez penser à votre problème de la même manière, vous avez dit à matlab d'assigner aux positions 1 et 4 pour qu'il s'arrête à 4 – Dan

Répondre

3

EDIT: Merci à Dan pour avoir souligné l'erreur.

vec == 0 produit une matrice logique. Maintenant, si la taille de newvec n'est pas définie alors newvec(vec==0) =1 créera toujours un nouveau vecteur de ligne newvec.

Les étapes suivantes décideront de la taille de cette newvec

temp1 = logical_matrix(:); 
trailing_zeros = number of zeros after the occurrence of last `true` value in temp1 
size(newvec) = [1, numel(logical_matrix) - trailing_zeros] ; 

Lorsque vous prédéfinir la taille de newvec alors newvec(v==0) = 1 ne peut pas changer la taille de newvec, il n'attribue 1 aux indices correspondants pour lesquels vec==0 est true.

+3

"créera un vecteur newvec dont la taille sera égale au nombre de valeurs vraies dans la matrice logique" non vrai, 'newvec' sera la taille de la position de la dernière valeur' true' dans votre matrice logique , pas le nombre de valeurs 'true'. – Dan

+2

* "... dont la taille sera égale au nombre de vraies (un) valeurs dans la matrice logique, qui dans ce cas est 4" *, ce n'est pas vrai maintenant, n'est-ce pas? Parce que la taille de 'newvec' dans l'exemple A est 1 × 6, alors qu'il n'y a que 3' trues' dans le 'vec' d'origine. La taille de 'newvec' dépend de la position du * dernier *' true', ce qui est plutôt étrange. –

+0

@Nishant: J'ai remarqué que vous faites parfois des erreurs dans votre syntaxe MATLAB dans vos réponses et commentaires. Suggérez que vous utilisiez réellement MATLAB et que vous reproduisiez la sortie à l'écran avant d'écrire vos réponses pour la prochaine fois. De cette façon, vous ne trompez pas le PO ainsi que d'autres personnes qui lisent vos réponses. – rayryeng

4

Pourquoi, nous ne le saurons jamais. C'est un choix de conception par The MathWorks, et à mon humble avis, il viole en effet le principle of least surprise.

Il sent un peu de premature optimization (en termes d'utilisation de RAM) et/ou que les internes de MATLAB appellent find avant l'affectation, ou quelque chose de similaire. Mais c'est n'importe qui devine, vraiment.

Une façon de faire ce que vous voulez plus commune, est la suivante:

newvec = (vec == 0); 
4

Si newvec n'existe pas lorsque vous appelez la deuxième ligne, ne fait Matlab aussi grand qu'il a besoin de tenir les index vous définissez sur 1.

Qu'est-ce que vous êtes en train de faire est:

newvec([1 4 6]) = 1; ou

newvec([1 4]) = 1;

De même, si vec était en fait une etc. 2D/3D matrice, newvec sortira comme 1 x N, où N est quel que soit le nombre d'index le plus élevé, et ne conserve pas la forme de la matrice d'origine.

Donc, dans ces cas, vous devez soit:

1) Préallouer newvec être la taille de vec premier.

2) Est-ce newvec = (vec==0) au lieu