87 votes

Comment itérer à travers chaque élément d'une matrice à n dimensions dans MATLAB ?

Je suis confronté à un problème. J'ai besoin d'itérer à travers chaque élément d'une matrice à n dimensions dans MATLAB. Le problème est que je ne sais pas comment le faire pour un nombre arbitraire de dimensions. Je sais que je peux dire

for i = 1:size(m,1)
    for j = 1:size(m,2)
        for k = 1:size(m,3)

et ainsi de suite, mais existe-t-il un moyen de le faire pour un nombre arbitraire de dimensions ?

13 votes

Note sur la terminologie Matlab : Matlab possède un petit nombre de types de données de base. Les plus importants sont : struct, matrix et cell array. Pour faire référence aux parties d'une matrice, il est courant d'utiliser le terme "élément", et de réserver le terme "cellule" aux parties d'un tableau de cellules. Les tableaux de cellules et les matrices présentent de nombreuses différences syntaxiques et sémantiques, même s'il s'agit de structures de données à N dimensions.

3 votes

Puis-je vous demander à quoi sert l'itération ? Peut-être y a-t-il une façon "vectorisée" de le faire à la place...

1voto

Dennis Jaheruddin Points 10154

Vous pouvez faire en sorte qu'une fonction récursive fasse le travail.

  • Soit L = size(M)
  • Soit idx = zeros(L,1)
  • Prenez length(L) comme la profondeur maximale
  • Boucle for idx(depth) = 1:L(depth)
  • Si votre profondeur est length(L) effectuer l'opération sur l'élément, sinon appeler de nouveau la fonction avec depth+1

Pas aussi rapide que les méthodes vectorielles si vous voulez vérifier tous les points, mais si vous n'avez pas besoin d'évaluer la plupart d'entre eux, cela peut être un gain de temps considérable.

-1voto

Erich Mirabal Points 6029

Si vous regardez plus profondément dans les autres utilisations de size vous pouvez voir que vous pouvez effectivement obtenir un vecteur de la taille de chaque dimension. Ce lien vous montre la documentation :

www.mathworks.com/access/helpdesk/help/techdoc/ref/size.html

Après avoir obtenu le vecteur taille, itérer sur ce vecteur. Quelque chose comme ceci (pardonnez ma syntaxe puisque je n'ai pas utilisé Matlab depuis le collège) :

d = size(m);
dims = ndims(m);
for dimNumber = 1:dims
   for i = 1:d[dimNumber]
      ...

Transformez cela en syntaxe Matlab-légale, et je pense que cela fera ce que vous voulez.

De plus, vous devriez être en mesure d'effectuer l'indexation linéaire telle que décrite. aquí .

0 votes

Je ne vois pas bien comment cet ordre de boucles va permettre d'itérer sur tous les éléments d'une matrice. Par exemple, si vous avez une matrice 3 par 4 (avec 12 éléments), votre boucle interne n'effectuera que 7 itérations.

0 votes

Elle doit itérer sur chaque dimension de la matrice. La boucle extérieure itère sur la dimension, la boucle intérieure sur la taille de cette dimension. Du moins, c'est l'idée. Comme tout le monde le dit, si tout ce qu'il veut est chaque cellule, l'indexation linéaire est la meilleure. S'il veut itérer sur chaque dimension, il devra faire quelque chose de similaire à ceci.

0 votes

Merci aussi pour la modification. Mon lien était un peu alambiqué et ne fonctionnait pas correctement avec la méthode habituelle. De plus, pour développer ma déclaration : il devrait toujours faire beaucoup d'autres suivis de l'index (en utilisant un compteur ou quelque chose comme ça). Je pense que votre approche ou celle d'Andrew serait plus facile pour ce que je pense qu'il essaie de faire.

-1voto

bmegli Points 11

Vous voulez simuler des boucles for n-nichées.

L'itération à travers un réseau n-dimmensionnel peut être considérée comme une augmentation du nombre à n chiffres.

A chaque dimmension nous avons autant de chiffres que la longueur de la dimmension.

Exemple :

Supposons que nous ayons array(matrix)

int[][][] T=new int[3][4][5];

dans "pour la notation" nous avons :

for(int x=0;x<3;x++)
   for(int y=0;y<4;y++)
       for(int z=0;z<5;z++)
          T[x][y][z]=...

pour simuler cela, il faudrait utiliser la "notation des nombres à n chiffres".

Nous avons un numéro à 3 chiffres, avec 3 chiffres pour le premier, 4 pour le second et 5 pour le troisième.

Nous devons augmenter le nombre, ainsi nous obtiendrions la séquence

0 0 0
0 0 1
0 0 2    
0 0 3
0 0 4
0 1 0
0 1 1
0 1 2
0 1 3
0 1 4
0 2 0
0 2 1
0 2 2
0 2 3
0 2 4
0 3 0
0 3 1
0 3 2
0 3 3
0 3 4
and so on

Vous pouvez donc écrire le code pour augmenter un tel nombre à n chiffres. Vous pouvez le faire de telle manière que vous pouvez commencer avec n'importe quelle valeur du nombre et augmenter/diminuer les chiffres par n'importe quel nombre. De cette façon, vous pouvez simuler des boucles for imbriquées qui commencent quelque part dans le tableau et ne se terminent pas à la fin.

Ce n'est pas une tâche facile. Je ne peux malheureusement pas vous aider avec la notation Matlab.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X