iとjは非常に人気のある変数名です(たとえば、この質問とこれを参照してください)。
たとえば、ループ内:
for i=1:10,
% Do something...
end
マトリックスへのインデックスとして:
mat(i, j) = 4;
なぜMATLABで変数名として使用すべきではないのですか?
iとは両方とも虚数単位jを表す関数であるため:
したがって、変数はそれらを呼び出すiかj、オーバーライドし、複雑な計算を行うコードを黙って壊してしまう可能性があります。
考えられる解決策には、代わりにループ変数としてiiとを使用するか、虚数単位を表すために必要な場合はいつでも使用することが含まれます。jj1ii
i変数または虚数単位であるという混乱を防ぐために、j変数を避けることをお勧めします。
ただし、個人的には、変数として、短いループのインデックスとして頻繁に使用iします。j私自身のコードの問題を回避するために、私は次の点に関する別の良い習慣に従います:虚数を表すためにそれらを使用しないiでください。実際、MATLAB独自のドキュメントには次のように記載されています。j
速度と堅牢性を向上させるために、complex
iを。に置き換えることができます。j1i
したがって、競合の可能性があるために非常に一般的に使用される2つの変数名を回避するのではなく、虚数について明示します。また、私のコードがより明確になります。私が見るときはいつでも、それが変数である可能性がないので、それが1i表すことを知っています。sqrt(-1)
古いバージョンのMATLABでは、変数名としての使用を避けるのに十分な理由がありました。i初期jのバージョンのMATLAB JITは、変数として使用しているか虚数単位として使用しているかを判断するのに十分ではありませんでした。他の方法で可能な多くの最適化をオフにします。
したがって、コードが変数として存在するだけで遅くなり、別のコードにi変更jすると速度が上がります。iiそのため、多くのMathWorksコードを読むと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、、およびukp
より長いインデックスの例:i_loop、、、、およびstepwalkt_now
もちろん、これは個人的な好みの問題でもありますが、長くなりすぎずに明確な意味を持つ使用するインデックスを見つけるのは難しいことではありません。
1iを書くのに受け入れられ、明確な方法sqrt(-1)であり、そのため、の使用を避ける必要はないことが指摘されましたi。繰り返しになりますが、デニスが指摘したように、との違いを理解するのは難しいかもしれませ1iんii。私の提案:1j可能な場合は架空の定数として使用してください。これは、電気技師が採用しているのとj同じsqrt(-1)トリックiです。
個人的に私は決して使用iしませんj; とiiをjj省略形のインデックス変数(およびkk、ll、mm、...)1jとして使用し、複素数を使用する必要がある場合に使用します。
虚数単位との混同はここで十分にカバーされていますが、これらおよび他の1文字の変数名が時々推奨されない理由は他にもいくつかあります。
特にMATLAB:コーダーを使用してMATLABコードからC ++ソースを生成している場合(恐ろしいことではありません)、入力の衝突が発生する可能性があるため、変数を再利用しないように明示的に警告されます。
一般に、IDEによっては、1文字の変数名が蛍光ペンや検索/置換で大混乱を引き起こす可能性があります。MATLABはこれに悩まされることはなく、Visual Studioにはしばらく問題がなかったと思いますが、MISRAなどのC /C++コーディング標準はそれらに反対する傾向があります。
私の側では、数学的なソースを直接実装することの明らかな利点にもかかわらず、すべての1文字の変数を避けています。最初の数百回は少し余分な努力が必要ですが、その後は気付かなくなり、あなたや他の貧しい人々があなたのコードを読むようになったときの利点は非常に大きいです。
デフォルトでは、虚数単位iをj表します。したがって、MATLABの観点からiは、変数として使用することは、変数として使用することに似て1います。
重要なコードには複数のforループが含まれているため、ベストプラクティスでは、その目的と範囲を示すわかりやすい名前を使用することをお勧めします。太古の昔から(そして、保存しない5〜10行のスクリプトを除いて)、私は常に、などの変数名を使用してきidxTaskましidxAnotherTaskたidxSubTask。
または、少なくとも配列の最初の文字を2倍にすると、インデックスを作成します。たとえば、ssインデックスを作成する、インデックスを作成するなどですが、複数のforループからインデックスを作成している配列を簡単に特定することはできません。subjectListtttaskListiijj
非常に混乱しているユーザーでない限り、変数名iとjを使用するリスクはほとんどないと思います。私はそれらを定期的に使用しています。私は、この慣行を避けるべきであるという公式の兆候を見たことがありません。
他の投稿で言及されているように、虚数単位をシャドウイングすると、状況によっては混乱が生じる可能性があることは事実ですが、全体として、それを大きな問題とは見なしていません。MATLABで実行できることは、はるかに紛らわしいものです。たとえば、次のように定義します。false=true
私の意見では、おそらくそれらを避けるべきなのは、コードが虚数を具体的に扱っている場合だけです。