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、オーバーライドして、複雑な計算を行うコードを暗黙のうちに破壊する可能性があります。
可能な解決策としては、代わりにiiand jjasループ変数を使用するか、虚数単位を表すために必要な1iときにいつでも使用することiが挙げられます。
iおよびj変数名を解決するために実行時間が犠牲になることにも注意してください。
forループを10億回呼び出す単純なテストはタイミングに統計的な違いを示さない)。これを正確に処理するための特別なコードがあり、iand j(およびk?)以外の変数を使用すると、実際には少し遅くなります。そして、実際に存在する違いはごくわずかです。単に使用しない理由はありませんiし、j通常の変数は、ちょうど他のMATLAB関数と同じように適切に使用する必要が-theyように。
forループを10億回呼び出して、あらゆる方法でタイミングスキームを試しても、違いはありませんでした。ループを繰り返し使用iしjているため、完全に有効なコードは間違っているという新しいSOユーザーが見られるのを目にしています。率直に言って、それはばかげているだけであり、人々はこの質問のより重要なポイントを見逃しています。それはi、j読みやすい最新のMatlabコードを書きたい場合、虚数単位に使用するべきではありません。
変数や虚数単位であることを混同しないようにi、j変数を回避することをお勧めします。
ただし、個人的には、変数として、短いループのインデックスとして頻繁に使用iしjます。私自身のコード内の問題を回避するために、私はに関する別の良いプラクティスに従うiとはj:いない虚数を表すためにそれらを使用しています。実際、Matlab自身のドキュメントは次のように述べています:
速度と堅牢性の向上のために、complex
iおよびjbyを置き換えることができます1i。
したがって、競合する可能性があるために2つの非常に一般的に使用される変数名を回避するのではなく、虚数について明示します。また、コードがより明確になります。私が見るときはいつでも、それが変数ではない可能性があるため、それが1i表すsqrt(-1)ことを知っています。
iし、j最高のですが、私の個人的なコーディングスタイルは、そのルールに従わない方法を説明しました。
1iでありi、複雑な数学には使用しないでください。虚数を考え、虚数を悪い習慣1iとしましょうi。その逆ではありません。使用してi、ii、iiiMATLABで一般的に行われていると人々はに固執問題がない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 iand 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倍にすると、たとえばssindex subjectListやindex などttにインデックスが作成されますtaskListが、そうでないii場合、またはjj複数のforループからインデックスを作成している配列を簡単に特定するのに役立ちません。
デフォルトiでjは、虚数単位を表します。したがって、MATLABの観点からiは、変数として使用することは1、変数として使用することに似ています。
iそしてj実際虚数部の値を返す関数です。スコープ内の関数と同じ名前の変数を使用できます。ただし、これは関数をシャドウします。
非常に混乱しているユーザーでない限り、変数名iとjを使用してもリスクはほとんどないと私は思います。私はそれらを定期的に使用しています。このような行為は避けるべきだという公式な指摘は見ていません。
他の投稿で述べられているように、架空のユニットをシャドウイングすることは、一部のコンテキストで混乱を引き起こす可能性があることは事実ですが、全体として私はそれを大きな問題とは見なしていません。たとえば、MATLABで定義すると、混乱が生じやすくなります。false=true
私の意見では、おそらくそれらを回避する必要があるのは、コードが特に虚数を扱う場合だけです。
i、j、k一般的なループ変数名として。