146 votes

Utiliser i et j comme variables dans Matlab

i et j sont des noms de variables très populaires (voir, par exemple, cette question et celle-ci ).

Par exemple, en boucles:

 for i=1:10,
    % do something...
end
 

Comme indices dans la matrice:

 mat( i, j ) = 4;
 

Pourquoi ne devraient- ils pas être utilisés dans Matlab?

177voto

Oli Charlesworth Points 148744

Parce qu' i et j sont à la fois des fonctions de la dénotation de l' imaginaire de l'unité:

Ainsi, une variable nommée i ou j va les remplacer, potentiellement silencieusement casser le code qui ne complexe de mathématiques.

Solutions possibles comprennent l'utilisation d' ii et jj que les variables de boucle au lieu de cela, ou à l'aide de 1i quand i est requis pour représenter l'imaginaire de l'unité.

66voto

shoelzer Points 3910

Il est de bonne pratique pour éviter i et j variables pour éviter la confusion au sujet de leur être variables ou de l'imaginaire de l'unité.

Personnellement, cependant, je l'utilise en i et j comme des variables assez souvent que l'indice de boucles courtes. Pour éviter des problèmes dans mon propre code, j'ai suivi une autre bonne pratique concernant l' i et j: ne pas utiliser pour désigner les nombres imaginaires. En fait, Matlab propres états de documentation:

Pour la vitesse et la robustesse améliorée, vous pouvez remplacer complexe i et j par 1i.

Donc, plutôt que d'éviter deux très couramment utilisé, les noms de variables en raison d'un conflit potentiel, je suis explicite sur les nombres imaginaires. Il rend également mon code plus clair. Quand je vois 1i, je sais que ça représente sqrt(-1) parce qu'il ne pouvait pas être une variable.

33voto

Sam Roberts Points 12090

Dans les anciennes versions de MATLAB, il y a une bonne raison d'éviter l'utilisation de i et j comme noms de variables - les premières versions de MATLAB JIT n'étaient pas assez intelligents pour savoir si vous avez été en utilisant comme variables ou comme unités imaginaires, et serait donc désactiver de nombreuses autrement optimisations possibles.

Votre code seraient donc plus lent juste par la présence d' i et j comme des variables, et de la vitesse, si vous avez changé quelque chose d'autre. C'est pourquoi, si vous lisez beaucoup de MathWorks de code, vous verrez ii et jj utilisé assez largement les indices de boucle. Pendant un moment, MathWorks pourrait même officieusement conseillé aux gens de faire eux-mêmes (bien que toujours officiellement conseiller aux gens de programme pour l'élégance/maintenabilité plutôt que quelle que soit la JIT, car c'est une cible en mouvement à chaque version).

Mais c'est plutôt il y a longtemps, et aujourd'hui, c'est un peu un "zombie" de l'émission qui est vraiment beaucoup moins importante que beaucoup de gens pensent encore, mais refuse de mourir.

Dans la toute récente version, c'est vraiment une question de préférence personnelle si l'utilisation de i et j comme noms de variable ou pas. Si vous faites beaucoup de travailler avec des nombres complexes, vous voudrez peut-être éviter i et j comme les variables, afin d'éviter toute petite potentiel de risque de confusion (bien que vous pouvez aussi vous/voulez plutôt utiliser uniquement 1i ou 1j , même pour moins de confusion, et un peu meilleure performance).

D'autre part, dans mon travail classique je n'ai jamais traiter avec des nombres complexes, et j'ai trouver mon code plus lisible si je me sens libre d'utiliser i et j comme les indices de boucle.


Je vois beaucoup de réponses ici qui disent qu'Il n'est pas recommandé... sans dire de qui fait que recommander. Voici la mesure de MathWorks effective des recommandations, à partir de la version actuelle de la documentation pour i:

Depuis que j'ai est une fonction, elle peut être remplacée et utilisé comme une variable. Cependant, il est préférable d'éviter d'utiliser i et j pour les noms de variables si vous avez l'intention de les utiliser dans le complexe de l'arithmétique. [...] Pour la vitesse et la robustesse améliorée, vous pouvez remplacer le complexe i et j par 1i.

16voto

Dennis Jaheruddin Points 10154

Comme décrit dans les autres réponses, l'utilisation de l' i dans code général n'est pas recommandé pour deux raisons:

  • Si vous souhaitez utiliser le nombre imaginaire, elle peut être confondue avec ou remplacé par un indice
  • Si vous l'utilisez comme un indice, il peut overwite ou être confondu avec le nombre imaginaire

Comme l'a suggéré: 1i et ii sont recommandés. Cependant, bien que ces deux beaux écarts de i, il n'est pas très agréable à utiliser ces deux options ensemble.

Voici un exemple de pourquoi (personnellement) je ne l'aime pas:

val2 = val + i  % 1
val2 = val + ii % 2
val2 = val + 1i % 3

On ne va pas facilement être mal interprété par deux ou trois, mais deux et trois ressembler à eachother.

Donc ma recommandation personnelle serait: Dans le cas où vous arrive de travailler avec des complexes de code toujours utiliser 1i combinée avec une autre variable de boucle.

Exemples de lettre unique indices que si vous n'utilisez pas plusieurs variables de boucle et de lettres suffisent: t,u,k et p

Exemple de plus des indices: i_loop,step,walk, et t_now

Bien sûr, c'est une question de goût personnel, mais il ne devrait pas être difficile de trouver des indices à utiliser qui ont une signification claire, sans devenir trop long.

12voto

Floris Points 31305

Il a été souligné qu' 1i est acceptable et sans ambiguïté la façon d'écrire sqrt(-1), et qu'à ce titre il n'est pas nécessaire d'éviter d'utiliser des i. Puis à nouveau, comme Dennis souligné (http://stackoverflow.com/a/14893729/1967396), il peut être difficile de voir la différence entre 1i et ii. Ma suggestion: utiliser 1j que l'imaginaire de la constante lorsque cela est possible. C'est le même truc que les ingénieurs électriques emploient - ils utiliser j pour sqrt(-1) car i est déjà pris pour le courant.

Personnellement je n'utilise jamais l' i et j;- je utiliser ii et jj comme la sténographie de l'indexation des variables, (et kk, ll, mm, ...) et 1j quand j'ai besoin d'utiliser les nombres complexes.

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