2010-06-01 8 views
0

Je parcours une boucle for, en extrayant à chaque fois certains éléments d'un tableau, par exemple element1, element2, etc. Comment puis-je regrouper tous les éléments que j'ai extraits ensemble pour avoir une liste d'eux?Pour les boucles dans Matlab

Répondre

1

construire la liste que vous allez:

for i = 1:whatever 
    ' pick out theValue 
    yourList(i) = theValue 
end 

Je suppose que vous choisissez un élément par itération de la boucle. Si ce n'est pas le cas, maintenez simplement un compteur et utilisez-le au lieu de i.

En outre, je suis pas en supposant que vous sortez vos éléments de la même position dans votre tableau chaque fois à travers la boucle. Si vous faites cela, examinez la suggestion de Donnie.

+1

Si vous Si vous ajoutez seulement à votre tableau, vous pouvez utiliser (fin + 1) au lieu de garder un compteur. La variable result doit être initialisée avant, par exemple à []. – Kleist

+0

+1 pour la référence circulaire :) – walkytalky

+0

@Kleist: Il est préférable d'initialiser la variable à sa taille finale, par ex. 'yourList = zéros (peu importe, 1)'. Faire pousser un tableau à l'intérieur d'une boucle peut beaucoup ralentir la boucle. – Jonas

3

John a couvert les bases de for boucles, donc ...

Notez que le code Matlab est souvent plus efficace si vous vectoriser au lieu d'utiliser des boucles (ce qui est moins vrai que l'habitude d'être). Par exemple, si dans votre boucle, vous êtes juste saisir la première valeur de chaque ligne d'une matrice, au lieu de vous en boucle pouvez faire:

yourValues = theMatrix(:,1) 

Lorsque l'opérateur : solo indique « toutes les valeurs possibles pour cet indice » . Si vous venez de commencer dans matlab il est certainement utile de lire sur matrix indexing in matlab (entre autres sujets).

0

Dans MATLAB, vous pouvez toujours effectuer une opération en boucle. Mais la méthode recommandée « Matlab » est d'éviter looping:

Supposons que vous voulez obtenir le sous-ensemble des éléments du tableau

destArray = []; 
for k=1:numel(sourceArray) 
    if isGoodMatch(sourceArray(k)) 
     destArray = [destArray, sourceArray(k)]; % This will create a warning about resizing 
    end 
end 

Vous effectuez la même tâche sans boucle:

matches = arrayfun(@(a) isGoodMatch(a), sourceArray); % returns a vector of bools 
destArray = sourceArray(matches);