i
und j
sind sehr beliebte Variablennamen (siehe z. B. diese und diese Frage ).
Zum Beispiel in Schleifen:
for i=1:10,
% do something...
end
Als Indizes in die Matrix:
mat( i, j ) = 4;
Warum sollten sie in Matlab nicht als Variablennamen verwendet werden?
i
,j
,k
wie die generischen Schleife Variablennamen.Antworten:
Weil
i
undj
beide Funktionen die imaginäre Einheit bezeichnen :Eine Variable, die aufgerufen wird
i
oderj
diese überschreibt, bricht möglicherweise stillschweigend Code, der komplexe Berechnungen ausführt.Mögliche Lösungen umfassen die Verwendung von
ii
undjj
als Schleifenvariablen oder die Verwendung,1i
wanni
immer dies zur Darstellung der imaginären Einheit erforderlich ist.quelle
i
undj
Variablen aufzulösen .for
Schleife 1 Milliarde Mal aufrufen, zeigen keinen statistischen Unterschied im Timing). Nach allem, was wir wissen, gibt es speziellen Code, um genau dies zu handhaben, und die Verwendung anderer Variablen alsi
undj
(undk
?) Ist tatsächlich etwas langsamer. Und Unterschiede, die existieren, sind im wirklichen Leben winzig bis nicht existent. Es gibt einfach keinen Grund, NICHT zu verwenden,i
undj
als reguläre Variablen müssen sie wie jede andere Matlab-Funktion ordnungsgemäß verwendet werden.for
Schleife 1 Milliarde Mal aufrief und alle möglichen Zeitschemata ausprobierte. Ich sehe, wie neuen SO-Benutzern gesagt wird, dass perfekt gültiger Code falsch ist, weil sie Schleifen verwendeni
undj
iterieren. Ehrlich gesagt ist es einfach albern und den Leuten fehlt der wichtigere Punkt dieser Frage: dasi
undj
sollte nicht einmal für die imaginäre Einheit verwendet werden, wenn man lesbaren modernen Matlab-Code schreiben möchte.Es ist eine gute Praxis, dies zu vermeiden
i
undj
Variablen zu verhindern Verwirrung über sie Variablen oder die imaginäre Einheit ist.Persönlich verwende ich jedoch
i
undj
als Variablen ziemlich oft als Index für kurze Schleifen. Um Probleme in meinem eigenen Code zu vermeiden, folge ich eine weitere gute Praxis in Bezug aufi
undj
: nicht verwende sie imaginäre Zahlen zu bezeichnen. In der Tat heißt es in Matlabs eigener Dokumentation :Anstatt zwei sehr häufig verwendete Variablennamen aufgrund eines möglichen Konflikts zu vermeiden, gehe ich explizit auf imaginäre Zahlen ein. Es macht auch meinen Code klarer. Immer
1i
wenn ich sehe , weiß ich, dass es darstellt,sqrt(-1)
weil es unmöglich eine Variable sein könnte.quelle
1i
. Das Ändern der Bedeutung voni
undj
kann jedoch zu schwer zu debuggenden Fehlern wie diesem führen .i
undj
am besten ist, aber erklärt, dass mein persönlicher Codierungsstil dieser Regel nicht folgt.1i
und nichti
für komplexe Mathematik. Stellen wir uns eine imaginäre Zahl als eine schlechte Praxis vor1i
und nehmen siei
als imaginäre Zahl. Nicht umgekehrt. Miti
,ii
,iii
ist gängige Praxis in Matlab und es gibt kein Problem , wenn die Leute zu halten1i
und1j
für komplexe Zahl. Auch Matlab respektiert dies und dieses verringert nicht die Leistung (soweit ich getestet habe), wie in der vorherigen Antwort angegeben.In alten Versionen von MATLAB gab es früher einen guten Grund, die Verwendung von
i
und zu vermeidenj
als Variablennamen Frühere Versionen von MATLAB JIT waren nicht klug genug, um festzustellen, ob Sie sie als Variablen oder als imaginäre Einheiten verwendeten, und würden dies daher tun Deaktivieren Sie viele ansonsten mögliche Optimierungen.Ihr Code würde daher nur durch das Vorhandensein von
i
undj
als Variablen langsamer werden und sich beschleunigen, wenn Sie sie in etwas anderes ändern. Wenn Sie viel MathWorks-Code lesen, werden Sie ihn daher ziemlich häufig als Schleifenindizes sehenii
undjj
verwenden. Für eine Weile hat MathWorks den Leuten möglicherweise sogar inoffiziell geraten, dies selbst zu tun (obwohl sie den Leuten offiziell immer raten, auf Eleganz / Wartbarkeit zu programmieren, anstatt auf das, was die aktuelle JIT tut, da es sich bei jeder Version um ein bewegliches Ziel handelt).Aber das ist schon lange her und heutzutage ist es ein bisschen ein "Zombie" -Problem, das wirklich viel weniger wichtig ist, als viele Leute immer noch denken, aber sich weigert zu sterben.
In jeder neueren Version ist es wirklich eine persönliche Präferenz, ob
i
undj
als Variablennamen verwendet werden sollen oder nicht. Wenn Sie viel mit komplexen Zahlen arbeiten, möchten Sie möglicherweisei
undj
als Variablen vermeiden, um ein geringes potenzielles Verwechslungsrisiko zu vermeiden (obwohl Sie möglicherweise auch / stattdessen nur1i
oder1j
für noch weniger Verwirrung und eine etwas bessere Leistung verwenden möchten ).Auf der anderen Seite, in meiner typischen Arbeit mit komplexen Zahlen , die ich nie beschäftigen und ich meinen Code besser lesbar , wenn ich frei fühlen zu bedienen
i
undj
als Loop - Indizes.Ich sehe hier viele Antworten, die besagen, dass es nicht empfohlen wird ... ohne zu sagen, wer diese Empfehlung tut. Hier ist der Umfang der tatsächlichen Empfehlungen von MathWorks aus der aktuellen Release-Dokumentation für
i
:quelle
Wie in anderen Antworten beschrieben, wird die Verwendung von
i
allgemeinem Code aus zwei Gründen nicht empfohlen:Wie vorgeschlagen:
1i
undii
werden empfohlen. Obwohl dies beide feine Abweichungen sindi
, ist es nicht sehr schön, beide Alternativen zusammen zu verwenden.Hier ist ein Beispiel, warum es mir (persönlich) nicht gefällt:
Man wird nicht leicht für zwei oder drei falsch verstanden, aber zwei und drei ähneln sich.
Daher wäre meine persönliche Empfehlung: Wenn Sie manchmal mit komplexem Code arbeiten, verwenden Sie immer eine
1i
Kombination mit einer anderen Schleifenvariablen.Beispiele für einzelne Buchstaben - Indizes , dass für , wenn Sie nicht viele Schleifenvariablen und Buchstaben genügen verwenden Sie:
t
,u
,k
undp
Beispiel für mehr Indizes:
i_loop
,step
,walk
, undt_now
Natürlich ist dies auch eine Frage des persönlichen Geschmacks, aber es sollte nicht schwer sein, Indizes zu finden, die eine klare Bedeutung haben, ohne zu lang zu werden.
quelle
1i
wird als Zahl anders gefärbt :)doc i
unddoc j
: "Für Geschwindigkeit und verbesserte Robustheit können Sie die komplexen i und j durch 1i ersetzen." IMO, im aktuellen Matlab gibt es keinen Grund, nichti
undj
in Schleifen usw. zu verwenden oder etwas anderes zu verwenden, als1i
die imaginäre Einheit zu bezeichnen (1j
funktioniert auch). Die einzige Ausnahme ist die Übergabe von Zeichenfolgen an die immer leicht inkompatible Symbolic-Engine. Seltsam , dasshelp 1i
unddoc 1i
nicht Arbeit though.Es wurde darauf hingewiesen, dass dies
1i
eine akzeptable und eindeutige Schreibweisesqrt(-1)
ist und dass es als solche nicht notwendig ist, die Verwendung zu vermeideni
. Andererseits kann es, wie Dennis betonte ( https://stackoverflow.com/a/14893729/1967396 ), schwierig sein, den Unterschied zwischen1i
und zu erkennenii
. Mein Vorschlag: Verwenden Sie1j
nach Möglichkeit als imaginäre Konstante. Es ist der gleiche Trick , dass Elektroingenieure beschäftigen - sie verwendenj
für ,sqrt(-1)
weili
bereits für genommen Strom .Persönlich benutze ich nie
i
undj
; Ich verwendeii
undjj
als Kurzindexierungsvariablen (und kk, ll, mm, ...) und1j
wenn ich komplexe Zahlen verwenden muss.quelle
1i
und zu erkennen.ii
" Und noch mehr den Unterschied zwischen1
undl
und zwischenO
und0
. Deshalb ist der erste Schritt, den ich in einer neuen MATALB-Installation mache, das Ändern der Standardschriftgröße.Die Verwechslung mit der imaginären Einheit wurde hier gut behandelt, aber es gibt einige andere prosaischere Gründe, warum diese und andere Ein-Buchstaben-Variablennamen manchmal nicht empfohlen werden.
MATLAB speziell: Wenn Sie einen Codierer verwenden, um eine C ++ - Quelle aus Ihrem MATLAB-Code zu generieren (nicht, es ist schrecklich), werden Sie ausdrücklich gewarnt, Variablen wegen möglicher Tippkonflikte nicht wiederzuverwenden.
Im Allgemeinen und abhängig von Ihrer IDE kann ein aus einem Buchstaben bestehender Variablenname Chaos mit Textmarkern und Suchen / Ersetzen verursachen. MATLAB leidet nicht darunter und ich glaube, dass Visual Studio seit einiger Zeit kein Problem mehr hat, aber die C / C ++ - Codierungsstandards wie MISRA usw. raten dazu.
Ich für meinen Teil vermeide alle Einbuchstabenvariablen, trotz der offensichtlichen Vorteile für die direkte Implementierung mathematischer Quellen. Es erfordert ein wenig zusätzliche Anstrengung, wenn Sie es die ersten paar hundert Male tun, aber danach hören Sie auf, es zu bemerken, und die Vorteile, wenn Sie oder eine andere arme Seele kommen, um Ihren Code zu lesen, sind Legion.
quelle
Jeder nicht triviale Code enthält mehrere
for
Schleifen. In den Best Practices wird empfohlen, einen beschreibenden Namen zu verwenden, der den Zweck und den Umfang angibt. Für undenkliche Zeiten (und es sei denn , seine 5-10 Zeilen Skript , dass ich nicht gehen zu retten bin), habe ich immer wie Variablennamen benutzenidxTask
,idxAnotherTask
undidxSubTask
usw.Oder zumindest den ersten Buchstaben des Arrays zu verdoppeln, das indiziert wird, z. B. um
ss
zu indizierensubjectList
, umtt
zu indizierentaskList
, aber nichtii
oderjj
was mir nicht hilft, mühelos zu identifizieren, welches Array sie aus meinen multiplen for-Schleifen indizieren.quelle
Standardmäßig
i
undj
stehen für die imaginäre Einheit. Aus Sicht von MATLAB ist die Verwendungi
als Variable also irgendwie wie die Verwendung1
als Variable.quelle
i
undj
sind tatsächlich Funktionen, die den Wert der imaginären Einheit zurückgeben. Es ist möglich, eine Variable mit demselben Namen als Funktion in einem Bereich zu verwenden. Dies wird jedoch die Funktion beschatten.Wenn Sie kein sehr verwirrter Benutzer sind, besteht meines Erachtens nur ein sehr geringes Risiko bei der Verwendung der Variablennamen i und j, und ich verwende sie regelmäßig. Ich habe keinen offiziellen Hinweis darauf gesehen, dass diese Praxis vermieden werden sollte.
Zwar kann das Abschatten der imaginären Einheit in einem bestimmten Kontext zu Verwirrung führen, wie in anderen Beiträgen erwähnt, aber insgesamt sehe ich es einfach nicht als großes Problem an. Es gibt weitaus verwirrendere Dinge, die Sie in MATLAB tun können, zum Beispiel das Definieren
false=true
Meiner Meinung nach sollten Sie sie wahrscheinlich nur vermeiden, wenn sich Ihr Code speziell mit imaginären Zahlen befasst.
quelle
i
es sich um eine Funktion handelt, kann sie überschrieben und als Variable verwendet werden. Es ist jedoch am besten, die Verwendung voni
undj
für Variablennamen zu vermeiden, wenn Sie diese in komplexer Arithmetik verwenden möchten." Dies scheint in Verbindung mit dem Kommentar von Eitan T zu Olivers Antwort (ich denke, er hat es zeitlich festgelegt) ein ausreichender Beweis zu sein.