i
とj
は非常に一般的な変数名です(例: this question および this one を参照)。
たとえば、ループ内:
for i=1:10,
% do something...
end
行列のインデックスとして:
mat( i, j ) = 4;
なぜMatlabで変数名として使用すべきではないのか?
i
とj
は両方とも 虚数単位 を示す関数であるためです。
そのため、i
またはj
と呼ばれる変数がそれらをオーバーライドし、複雑な計算を行うコードを静かに破壊する可能性があります。
可能な解決策には、代わりにループ変数としてii
とjj
を使用するか、1i
虚数単位を表すためにi
が必要な場合はいつでも。
i
変数とj
変数を避けて、変数または虚数単位であるという混乱を防ぐことをお勧めします。
しかし、個人的には、i
とj
を短いループのインデックスとして非常に頻繁に変数として使用します。自分のコードの問題を避けるために、i
とj
に関する別の良い習慣に従います:do n'tuseそれらは虚数を示します。実際、 Matlab自身のドキュメントの状態 :
速度と堅牢性を向上させるために、複雑な
i
とj
を_1i
_に置き換えることができます。
したがって、潜在的な競合のために非常に一般的に使用される2つの変数名を回避するのではなく、虚数について明示的に説明します。また、コードがより明確になります。 _1i
_が表示されるときはいつでも、それがsqrt(-1)
を表していることを知っています。変数にできない可能性があるからです。
MATLABの古いバージョンでは、変数名としてi
とj
の使用を避ける正当な理由がありました-MATLAB JITの初期バージョンは、あなたがそれらを変数または虚数単位として使用するため、多くの場合可能な最適化がオフになります。
したがって、変数としてi
とj
が存在するだけでコードは遅くなり、それらを別のものに変更すると速度が向上します。そのため、多くのMathWorksコードを読むと、ii
とjj
がループインデックスとしてかなり広く使用されていることがわかります。しばらくの間、MathWorksは自分でそれを行うように非公式に人々にアドバイスすることさえありました(ただし、各バージョンを動かすターゲットであるため、現在のJITが行うものではなく、優雅さ/保守性をプログラムするよう常に人々に公式にアドバイスしています)。
しかし、それはかなり前のことであり、今日では多くの人がまだ考えているよりもはるかに重要ではないが、死ぬことを拒否する「ゾンビ」の問題です。
最近のバージョンでは、i
とj
を変数名として使用するかどうかは個人的に好みです。複雑な数で多くの作業を行う場合、混乱の小さな潜在的なリスクを避けるために、変数としてi
とj
を避けることができます(ただし、/つかいます 1i
または1j
混乱を減らし、パフォーマンスを少し向上させます)。
一方、私の典型的な作業では、複素数を扱うことはありません。ループインデックスとしてi
とj
を自由に使用できると、コードが読みやすくなります。
ここに推奨されません...と言う答えがたくさんあります。 i
の現在のリリースドキュメントから、MathWorksの実際の推奨範囲を以下に示します。
Iは関数なので、オーバーライドして変数として使用できます。ただし、複雑な算術演算で使用する場合は、変数名にiとjを使用しないようにすることをお勧めします。 [...]速度と堅牢性を向上させるために、複雑なiとjを1iに置き換えることができます。
他の回答で説明したように、一般的なコードでi
を使用することは、次の2つの理由で推奨されません。
提案どおり:1i
およびii
が推奨されます。ただし、これらは両方ともi
からの微妙な違いですが、これらの選択肢の両方を一緒に使用するのはあまり良いことではありません。
以下に(個人的に)気に入らない理由の例を示します。
val2 = val + i % 1
val2 = val + ii % 2
val2 = val + 1i % 3
2つまたは3つを間違えることは簡単ではありませんが、2つと3つは互いに似ています。
そのため、私の個人的な推奨事項は次のとおりです。複雑なコードで作業することがある場合は、常に1i
を別のループ変数と組み合わせます。
ループ変数と文字をあまり使用しない場合に十分な単一文字インデックスの例:t
、u
、k
およびp
長いインデックスの例:i_loop
、step
、walk
、およびt_now
もちろん、これは個人的な好みの問題でもありますが、長くなりすぎずに明確な意味を持つ使用するインデックスを見つけるのは難しくありません。
1i
はsqrt(-1)
を記述するための許容できる明確な方法であり、i
の使用を避ける必要はないことが指摘されました。それから、デニスが指摘したように( https://stackoverflow.com/a/14893729/1967396 )、1i
とii
の違いを見分けるのは難しいかもしれません。私の提案:可能な限り虚数定数として1j
を使用してください。これは、電気技術者が採用しているのと同じトリックです。j
はすでに current に使用されているため、sqrt(-1)
にはi
を使用します。
個人的にはi
とj
を使用しません。複素数を使用する必要がある場合は、ii
とjj
を略式のインデックス変数(およびkk、ll、mm、...)および1j
として使用します。
架空のユニットとの混乱はここで十分にカバーされていますが、これらおよび他の1文字の変数名がときどき推奨されない他のより平凡な理由がいくつかあります。
特にMATLAB:コーダーを使用してMATLABコードからC++ソースを生成している場合(恐ろしいことではありません)、タイプ衝突の可能性があるため、変数を再利用しないように明示的に警告されます。
通常、IDEによっては、1文字の変数名が蛍光ペンと検索/置換で大混乱を引き起こす可能性があります。 MATLABはこれに悩まされておらず、Visual Studioにはしばらくの間問題がなかったと思いますが、MISRAなどのC/C++コーディング標準はそれらを再度アドバイスする傾向があります。
私の側では、数学的なソースを直接実装することの明らかな利点にもかかわらず、すべての1文字の変数を避けています。最初の数百回は少し手間がかかりますが、その後は気づかないようになり、コードを読むためにあなたや他の貧しい人々が来るときの利点はたくさんあります。
自明でないコードには複数のfor
ループが含まれます。ベストプラクティスでは、その目的と範囲を示すわかりやすい名前を使用することをお勧めします。太古の時代(そして、保存しない5〜10行のスクリプトでない限り)、常にidxTask
、idxAnotherTask
、idxSubTask
などの変数名を使用していました。 。
または、少なくとも配列の最初の文字を2倍にして、インデックスを作成しています。 ss
はインデックスにsubjectList
に、tt
はインデックスtaskList
に、ただしii
またはjj
は無効複数のforループからインデックス付けされている配列を簡単に識別できます。
デフォルトでは、i
とj
は虚数単位を表します。そのため、MATLABの観点からは、変数としてi
を使用することは、変数として1
を使用することに似ています。
あなたが非常に混乱したユーザーでない限り、変数名iおよびjそして、私はそれらを定期的に使用しています。私は、この慣行を避けるべきであるという公式の兆候を見たことはありません。
想像上のユニットをシャドウイングすることは、他の投稿で言及されているように、いくつかのコンテキストで混乱を引き起こす可能性があるのは事実ですが、全体的に私はそれを大きな問題とは考えていません。 MATLABでできることははるかに複雑です。たとえば、false=true
私の意見では、おそらくあなたのコードが虚数を扱う場合のみ、それらを避けるべきです。
なぜなら、iとjはデフォルトでは虚数単位だからです。 iおよびjに他の値を割り当てると、デフォルト値が上書きされます。これにより混乱が生じる可能性があります。ただし、これを回避する良い方法は、1iと1jを虚数単位として使用することです。一般に、niとnjを使用して虚数を表すことができます。
例えば:
>> i
ans =
0.0000 + 1.0000i
>> i=2
i =
2
>> 1i
ans =
0.0000 + 1.0000i