8
votes

Neat Way de boucle avec l'index et la valeur dans Matlab

Beaucoup de mes boucles ressemblent à ceci:

items = [3,14,15,92];
for item_i = 1:numel(items)
    item = items(item_i);
    % ...
end


2 commentaires

Indépendamment de cela, il est faux de faire du double travail. Je pense toujours que cette solution est la plus facile / naturelle à lire.


Je trouve la réponse acceptée plus courte et plus lisible.


4 Réponses :


1
votes

Cela fonctionnera-t-il pour vous? XXX

J'espère que cela aide.


2 commentaires

Je dois référencer l'index des éléments au sein de la boucle, par exemple. afin de stocker des calculs sur la bonne position dans une matrice.


J'ai édité la réponse maintenant. Devrait fonctionner, mais je préférerais probablement utiliser votre solution d'origine.



5
votes

Je crois qu'il n'y a aucun moyen de le faire. Une astuce que j'ai utilisée dans le passé est d'exploiter le fait que Matlab boucle sur les colonnes d'une matrice, de sorte que vous pouvez définir une fonction énumérer qui ajoute une ligne d'index au sommet d'une matrice: xxx

puis utilisez-le comme suit: xxx

Mais ce n'est pas vraiment meilleur que ce que tu étais faire à l'origine. Ce serait bien si ã la python vous pouviez alors quelque chose comme xxx

énumérer est une fonction qui renvoie deux matrices de la même longueur, mais ... vous ne pouvez pas.


1 commentaires

+1: C'est ce que j'utilise aussi de temps en temps, sauf que ma syntaxe est pour k = [articles; 1: longueur (éléments)] si éléments est une matrice ou pour k = [éléments; Num2Cell (1: longueur (éléments))] pour la contrepartie de la matrice de cellule.



2
votes

Je ferai de temps en temps quelque chose comme ça xxx

mais cela n'est utile que dans des situations très spécifiques (spécifiquement, ces mêmes situations que vous utiliseriez arrayfun pour raccourcir Syntaxe), et pour être honnête, la façon dont vous le faisiez au départ est probablement mieux pour la plupart des cas - toute autre chose va probablement obscurcer votre intention.


3 commentaires

Dans votre exemple, vous pouvez éviter arrayfun en faisant arr = [arr; num2cell (1: longueur (arr))]; sprintf ('% s (article% d) \ n', arr {:}) :)


@Ittant: Nice! Je ne savais pas sur num2cell . Bien que ce code renvoie un tableau char et non une cellule .


Vous avez raison. Ensuite, utilisez Textscan (Sprintf ('% S (Item% d) \ n', arr {:}), '% S', 'Délimiter', '') Pour scinder le résultat dans les cellules: )



7
votes

Semblable à la réponse de Chris Taylor, vous pouvez le faire:

function [ output ] = Enumerate( items )
output = struct('Index',num2cell(1:length(items)),'Value',num2cell(items));
end


items = [3,14,15,92];
for item = Enumerate(items)
   item.Index
   item.Value
end


0 commentaires