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
En tant qu'indices dans la matrice:
mat( i, j ) = 4;
Pourquoi ne devraient- ils pas être utilisés comme noms de variables dans Matlab?
i
,j
,k
comme les noms de variables génériques en boucle.Réponses:
Parce que
i
etj
sont les deux fonctions désignant l' unité imaginaire :Ainsi, une variable appelée
i
ouj
les remplacera, cassant potentiellement silencieusement du code qui effectue des calculs complexes.Les solutions possibles incluent l'utilisation de
ii
etjj
comme variables de boucle à la place, ou l'utilisation de1i
chaque fois que celai
est nécessaire pour représenter l'unité imaginaire.la source
i
etj
.for
boucle 1 milliard de fois ne montrent aucune différence statistique de timing). Pour tout ce que nous savons, il existe un code spécial pour gérer exactement cela et l'utilisation de variables autres quei
etj
(etk
?) Est en fait légèrement plus lente. Et les différences qui existent sont minuscules voire inexistantes dans la vie réelle. Il n'y a tout simplement aucune raison de NE PAS utiliseri
et enj
tant que variables régulières, elles doivent simplement être utilisées correctement comme toute autre fonction Matlab.for
boucle 1 milliard de fois et en essayant toutes sortes de schémas de synchronisation. Je vois de nouveaux utilisateurs SO se faire dire qu'un code parfaitement valide est faux parce qu'ils utilisenti
etj
pour itérer des boucles. Franchement, c'est juste idiot et les gens manquent le point le plus important de cette question: celai
etj
ne devrait même pas être utilisé pour l'unité imaginaire si l'on veut écrire du code Matlab moderne lisible.Il est recommandé d'éviter les variables
i
etj
d'éviter toute confusion sur le fait qu'elles soient des variables ou l'unité imaginaire.Personnellement, cependant, j'utilise
i
etj
comme variables assez souvent comme index des boucles courtes. Pour éviter les problèmes dans mon propre code, je suis une autre bonne pratique concernanti
etj
: ne les utilisez pas pour désigner des nombres imaginaires. En fait, la propre documentation de Matlab déclare :Donc, plutôt que d'éviter deux noms de variables très couramment utilisés en raison d'un conflit potentiel, je suis explicite sur les nombres imaginaires. Cela rend également mon code plus clair. Chaque fois que je vois
1i
, je sais que cela représentesqrt(-1)
parce qu'il ne pourrait pas être une variable.la source
1i
. Cependant, changer la signification dei
etj
peut entraîner des erreurs difficiles à déboguer comme celle-ci .i
etj
c'est mieux, mais j'ai expliqué comment mon style de codage personnel ne suit pas cette règle.1i
et noni
pour des mathématiques complexes. Pensons au nombre imaginaire comme1i
et prenonsi
comme nombre imaginaire une mauvaise pratique. Pas l'inverse. L' utilisationi
,ii
,iii
est une pratique courante dans Matlab et il n'y a pas de problème quand les gens tiennent à1i
et1j
pour nombre complexe. Matlab respecte également cela et celui-ci ne diminue pas les performances (dans la mesure où j'ai testé) comme indiqué dans la réponse précédente.Dans les anciennes versions de MATLAB, il y avait une bonne raison d'éviter l'utilisation de
i
etj
comme noms de variables - les premières versions de MATLAB JIT n'étaient pas assez intelligentes pour dire si vous les utilisiez comme variables ou comme unités imaginaires, et désactiver de nombreuses optimisations autrement possibles.Votre code deviendrait donc plus lent simplement par la présence même de
i
et enj
tant que variables, et accélérerait si vous les changiez en autre chose. C'est pourquoi, si vous lisez beaucoup de code MathWorks, vous verrezii
et vous l'jj
utiliserez assez largement comme indices de boucle. Pendant un certain temps, MathWorks pourrait même avoir officieusement conseillé aux gens de le faire eux-mêmes (bien qu'ils conseillent toujours officiellement aux gens de programmer pour l'élégance / la maintenabilité plutôt que pour tout ce que fait le JIT actuel, car c'est une cible mobile à chaque version).Mais c'était il y a assez longtemps, et de nos jours c'est un peu un problème de «zombie» qui est vraiment beaucoup moins important que beaucoup de gens ne le pensent encore, mais qui refuse de mourir.
Dans n'importe quelle version récente, c'est vraiment une préférence personnelle d'utiliser
i
etj
comme noms de variables ou non. Si vous travaillez beaucoup avec des nombres complexes, vous voudrez peut-être éviteri
et enj
tant que variables, pour éviter tout petit risque potentiel de confusion (bien que vous puissiez également / plutôt vouloir utiliser uniquement1i
ou1j
pour encore moins de confusion, et un peu mieux les performances ).D'un autre côté, dans mon travail typique, je ne m'occupe jamais de nombres complexes, et je trouve mon code plus lisible si je me sens libre d'utiliser
i
etj
comme index de boucle.Je vois beaucoup de réponses ici qui disent que ce n'est pas recommandé ... sans dire qui fait cela en recommandant. Voici l'étendue des recommandations réelles de MathWorks, tirées de la documentation de la version actuelle pour
i
:la source
Comme décrit dans d'autres réponses, l'utilisation du
i
code en général n'est pas recommandée pour deux raisons:Comme suggéré:
1i
etii
sont recommandés. Cependant, bien qu'il s'agisse de très bons écarts par rapport ài
, il n'est pas très agréable d'utiliser ces deux alternatives ensemble.Voici un exemple pourquoi (personnellement) je ne l'aime pas:
Un ne sera pas facilement mal lu pendant deux ou trois, mais deux et trois se ressemblent.
Par conséquent, ma recommandation personnelle serait: au cas où vous travaillez parfois avec du code complexe, utilisez toujours
1i
combiné avec une variable de boucle différente.Exemples d'indices à une lettre que pour si vous n'utilisez pas beaucoup de variables de boucle et lettres suffisent:
t
,u
,k
etp
Exemple d'indices plus:
i_loop
,step
,walk
ett_now
Bien sûr, c'est aussi 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 longs.
la source
1i
sera coloré différemment sous forme de nombre :)doc i
etdoc j
: "Pour plus de rapidité et une meilleure robustesse, vous pouvez remplacer les complexes i et j par 1i." IMO, dans Matlab actuel, il n'y a aucune raison de ne pas utiliseri
etj
en boucles, etc., ou d'utiliser autre chose que1i
pour désigner l'unité imaginaire (1j
fonctionne aussi). La seule exception concerne le passage de chaînes au moteur Symbolic toujours légèrement incompatible. Cela est étrangehelp 1i
etdoc 1i
ne fonctionne pas.Il a été souligné que
1i
c'est une manière d'écrire acceptable et sans ambiguïtésqrt(-1)
et qu'en tant que telle, il n'est pas nécessaire d'éviter d'utiliseri
. Là encore, comme Dennis l'a souligné ( https://stackoverflow.com/a/14893729/1967396 ), il peut être difficile de voir la différence entre1i
etii
. Ma suggestion: utiliser1j
comme constante imaginaire si possible. Il est le même tour que les ingénieurs électriciens emploient - ils utilisentj
poursqrt(-1)
causei
est déjà pris pour courant .Personnellement, je n'utilise jamais
i
etj
; J'utiliseii
etjj
comme variables d'indexation abrégées, (et kk, ll, mm, ...) et1j
lorsque j'ai besoin d'utiliser des nombres complexes.la source
1i
etii
" Et encore plus la différence entre1
etl
et entreO
et0
. C'est pourquoi la première étape que je fais dans une nouvelle installation de MATALB est de changer la taille de police par défaut.La confusion avec l'unité imaginaire a été bien couverte ici, mais il y a d'autres raisons plus prosaïques pour lesquelles ces noms de variables à une seule lettre sont parfois découragés.
MATLAB spécifiquement: si vous utilisez un codeur pour générer une source C ++ à partir de votre code MATLAB (ne le faites pas, c'est horrible), vous êtes explicitement averti de ne pas réutiliser les variables en raison de conflits de frappe potentiels.
En général, et en fonction de votre IDE, un nom de variable à une seule lettre peut causer des ravages avec les surligneurs et la recherche / remplacement. MATLAB n'en souffre pas et je pense que Visual Studio n'a pas eu de problème depuis un certain temps, mais les normes de codage C / C ++ comme MISRA etc. ont tendance à les déconseiller.
Pour ma part, j'évite toutes les variables à une seule lettre, malgré les avantages évidents à implémenter directement des sources mathématiques. Cela demande un peu d'effort supplémentaire les premières centaines de fois que vous le faites, mais après cela, vous arrêtez de le remarquer, et les avantages lorsque vous ou une autre pauvre âme venez lire votre code sont légion.
la source
Tout code non trivial contient plusieurs
for
boucles, et les meilleures pratiques vous recommandent d'utiliser un nom descriptif indiquant son objectif et sa portée. Pour des temps immémoriaux (et à moins que son script 5-10 lignes que je ne vais pas sauver), je l' ai toujours été en utilisant des noms de variables commeidxTask
,idxAnotherTask
etidxSubTask
etc.Ou au moins doubler la première lettre du tableau qu'il indexe, par exemple
ss
pour indexersubjectList
,tt
indexertaskList
, mais pasii
oujj
qui ne m'aide pas à identifier sans effort le tableau qu'ils indexent parmi mes multiples boucles for.la source
Par défaut
i
etj
représente l'unité imaginaire. Donc, du point de vue de MATLAB, utiliseri
comme variable équivaut en quelque sorte à utiliser1
comme variable.la source
i
etj
sont en fait des fonctions retournant la valeur de l'unité imaginaire. Il est possible d'utiliser une variable avec le même nom qu'une fonction dans une portée. Cela masquera cependant la fonction.Sauf si vous êtes un utilisateur très confus, je pense qu'il y a très peu de risque à utiliser les noms de variables i et j et je les utilise régulièrement. Je n'ai vu aucune indication officielle selon laquelle cette pratique devrait être évitée.
S'il est vrai que l'observation de l'unité imaginaire pourrait causer une certaine confusion dans certains contextes, comme mentionné dans d'autres articles, dans l'ensemble, je ne le vois tout simplement pas comme un problème majeur. Il y a des choses beaucoup plus déroutantes que vous pouvez faire dans MATLAB, prenez par exemple la définition
false=true
À mon avis, le seul moment où vous devriez probablement les éviter est si votre code traite spécifiquement des nombres imaginaires.
la source
i
est une fonction, elle peut être remplacée et utilisée comme variable. Cependant, il est préférable d'éviter d'utiliseri
etj
pour les noms de variables si vous avez l'intention de les utiliser en arithmétique complexe." Cela, en conjonction avec le commentaire d'Eitan T sur la réponse d'Oliver (je suppose qu'il a chronométré) semble une preuve suffisante.