i
およびj
は非常に人気のある変数名です(たとえば、この質問とこれを参照)。
たとえば、ループでは:
for i=1:10,
% do something...
end
行列へのインデックスとして:
mat( i, j ) = 4;
Matlabで変数名として使用してはいけないのはなぜですか?
i
およびj
は非常に人気のある変数名です(たとえば、この質問とこれを参照)。
たとえば、ループでは:
for i=1:10,
% do something...
end
行列へのインデックスとして:
mat( i, j ) = 4;
Matlabで変数名として使用してはいけないのはなぜですか?
回答:
なぜならi
とj
表す両方の機能である虚数単位:
したがって、変数がそれらを呼び出すi
かj
、オーバーライドして、複雑な計算を行うコードを暗黙のうちに破壊する可能性があります。
可能な解決策としては、代わりにii
and jj
asループ変数を使用するか、虚数単位を表すために必要な1i
ときにいつでも使用することi
が挙げられます。
i
およびj
変数名を解決するために実行時間が犠牲になることにも注意してください。
for
ループを10億回呼び出す単純なテストはタイミングに統計的な違いを示さない)。これを正確に処理するための特別なコードがあり、i
and j
(およびk
?)以外の変数を使用すると、実際には少し遅くなります。そして、実際に存在する違いはごくわずかです。単に使用しない理由はありませんi
し、j
通常の変数は、ちょうど他のMATLAB関数と同じように適切に使用する必要が-theyように。
for
ループを10億回呼び出して、あらゆる方法でタイミングスキームを試しても、違いはありませんでした。ループを繰り返し使用i
しj
ているため、完全に有効なコードは間違っているという新しいSOユーザーが見られるのを目にしています。率直に言って、それはばかげているだけであり、人々はこの質問のより重要なポイントを見逃しています。それはi
、j
読みやすい最新のMatlabコードを書きたい場合、虚数単位に使用するべきではありません。
変数や虚数単位であることを混同しないようにi
、j
変数を回避することをお勧めします。
ただし、個人的には、変数として、短いループのインデックスとして頻繁に使用i
しj
ます。私自身のコード内の問題を回避するために、私はに関する別の良いプラクティスに従うi
とはj
:いない虚数を表すためにそれらを使用しています。実際、Matlab自身のドキュメントは次のように述べています:
速度と堅牢性の向上のために、complex
i
およびj
byを置き換えることができます1i
。
したがって、競合する可能性があるために2つの非常に一般的に使用される変数名を回避するのではなく、虚数について明示します。また、コードがより明確になります。私が見るときはいつでも、それが変数ではない可能性があるため、それが1i
表すsqrt(-1)
ことを知っています。
i
し、j
最高のですが、私の個人的なコーディングスタイルは、そのルールに従わない方法を説明しました。
1i
でありi
、複雑な数学には使用しないでください。虚数を考え、虚数を悪い習慣1i
としましょうi
。その逆ではありません。使用してi
、ii
、iii
MATLABで一般的に行われていると人々はに固執問題がない1i
と1j
複素数のためには。また、Matlabはこれを尊重し、以前の回答で述べたように、これは(私がテストした限り)パフォーマンスを低下させません。
以前のバージョンのMATLABでは、変数名i
やj
変数名としての使用を回避するのに十分な理由がありました。MATLABJITの初期バージョンは、それらを変数として使用するのか、虚数単位として使用するのかを判断するのに十分ではなかったため、他の多くの可能な最適化をオフにします。
したがって、コードが変数として存在するだけでコードが遅くi
なりj
、変数を別のものに変更するとスピードが向上します。そのため、多くのMathWorksコードを読むii
とjj
、ループインデックスとしてかなり広く使用されます。しばらくの間、MathWorksは非公式に人々に自分でそれを行うようにアドバイスすることさえありました(ただし、現在のJITが行うバージョンではなく、エレガントで保守性の高いプログラムを人々に公式に勧めています)。
しかし、それはかなり昔のことであり、今日では、「ゾンビ」の問題であり、多くの人が考えているよりもはるかに重要ではありませんが、死ぬことを拒否しています。
最近のバージョンでは、それは実際に使用するかどうか個人的な好みだi
とj
変数名やないと。複雑な数値で多くの作業を行う場合は、変数として、または混乱の小さな潜在的なリスクを回避するためi
にj
、変数として使用することをお勧めします(ただし、/または代わりに使用する1i
か1j
、または混乱を少なくし、パフォーマンスを少し向上させることもできます))。
一方、私の典型的な作業では、複素数を扱うことはなく、ループインデックスとして自由に使用できるi
と、コードが読みやすくなりj
ます。
私はここに「お勧めできません...」と言っている答えがたくさんあります。以下は、現在のリリースドキュメントからのMathWorksの実際の推奨事項の範囲ですi
。
iは関数なので、オーバーライドして変数として使用できます。ただし、複雑な算術演算で使用する場合は、変数名にiとjを使用しないことをお勧めします。[...]速度と堅牢性を向上させるために、複雑なiとjを1iに置き換えることができます。
他の回答で説明されているようにi
、一般的なコードの使用は、次の2つの理由で推奨されていません。
提案されているとおり:1i
とii
推奨されます。ただし、これらはどちらもからの細かい変更i
ですが、これらの両方を一緒に使用するのはあまり良くありません。
(個人的に)嫌いな例を以下に示します。
val2 = val + i % 1
val2 = val + ii % 2
val2 = val + 1i % 3
1つは2つまたは3つに読み間違えにくいでしょうが、2つと3つは互いに似ています。
したがって、私の個人的な推奨事項は次のとおり1i
です。複雑なコードを使用する場合は、常に別のループ変数と組み合わせて使用します。
あなたは多くのループ変数や手紙で十分に使用しない場合のために、単一の文字指標の例:t
、u
、k
およびp
長い指標の例:i_loop
、step
、walk
、およびt_now
もちろんこれは個人の好みの問題でもありますが、あまり長く成長せずに明確な意味を持つ使用するインデックスを見つけることは難しくありません。
doc i
and from doc j
:「速度と堅牢性の向上のために、複雑なiとjを1iに置き換えることができます。」IMO、現在のMatlabでは、ループなどで使用しない理由i
や、虚数単位を表すj
以外の方法を使用する理由はありません1i
(1j
動作します)。唯一の例外は、常にわずかに互換性のないシンボリックエンジンに文字列を渡す場合です。奇妙なことですがhelp 1i
、機能doc 1i
しません。
これ1i
は、受け入れ可能で明確な記述方法sqrt(-1)
であり、そのため、の使用を避ける必要がないことが指摘されましたi
。次に、デニスが指摘したように(https://stackoverflow.com/a/14893729/1967396)、との違いを確認するのは難しい場合が1i
ありii
ます。私の提案:1j
可能な場合は虚数定数として使用します。彼らが使用する-それは、電気技術者が採用したのと同じトリックだj
ためsqrt(-1)
ので、i
すでにのために取られている現在。
個人的に私は使用i
しませんj
。私が使用ii
してjj
速記インデックス変数、(およびKK、LL、MM、...)として1j
とき、私は複素数を使用する必要があります。
1i
とii
の間に、さらに違い」1
とl
との間O
とを0
。そのため、MATALBの新規インストールで最初に行うステップは、デフォルトのフォントサイズを変更することです。
虚数単位との混同についてはここで十分に説明しましたが、これらおよび他の1文字の変数名が時々推奨されない理由が他にもあります。
特にMATLAB:コーダーを使用してMATLABコードからC ++ソースを生成している場合(そうしないでください、それは恐ろしいことです)、潜在的な型の衝突のために変数を再利用しないように明示的に警告されます。
一般的に、IDEによっては、1文字の変数名が蛍光ペンや検索/置換で混乱を招く可能性があります。MATLABはこれに悩まされることはなく、Visual Studioにはしばらく問題がなかったと思いますが、MISRAなどのC / C ++コーディング標準はそれらについて再度アドバイスする傾向があります。
私の部分では、数学的ソースを直接実装することの明らかな利点にもかかわらず、1文字の変数はすべて避けています。最初の数百回は少し余分な労力がかかりますが、その後は気付かなくなり、あなたや他の貧しい魂がコードを読むようになるときの利点は軍団です。
重要なコードには複数のfor
ループが含まれており、ベストプラクティスでは、その目的と範囲を示すわかりやすい名前を使用することをお勧めします。(私は保存するつもりはないということと、その5-10ラインスクリプトでない限り)太古の時間のために、私はいつものように、変数名を使用しているidxTask
、idxAnotherTask
とidxSubTask
など
または、配列の最初の文字を少なくとも2倍にすると、たとえばss
index subjectList
やindex などtt
にインデックスが作成されますtaskList
が、そうでないii
場合、またはjj
複数のforループからインデックスを作成している配列を簡単に特定するのに役立ちません。
デフォルトi
でj
は、虚数単位を表します。したがって、MATLABの観点からi
は、変数として使用することは1
、変数として使用することに似ています。
i
そしてj
実際虚数部の値を返す関数です。スコープ内の関数と同じ名前の変数を使用できます。ただし、これは関数をシャドウします。
非常に混乱しているユーザーでない限り、変数名iとjを使用してもリスクはほとんどないと私は思います。私はそれらを定期的に使用しています。このような行為は避けるべきだという公式な指摘は見ていません。
他の投稿で述べられているように、架空のユニットをシャドウイングすることは、一部のコンテキストで混乱を引き起こす可能性があることは事実ですが、全体として私はそれを大きな問題とは見なしていません。たとえば、MATLABで定義すると、混乱が生じやすくなります。false=true
私の意見では、おそらくそれらを回避する必要があるのは、コードが特に虚数を扱う場合だけです。
i
、j
、k
一般的なループ変数名として。