Matlabで変数としてiとjを使用する


142

iおよびjは非常に人気のある変数名です(たとえば、この質問これを参照)。

たとえば、ループでは:

for i=1:10,
    % do something...
end

行列へのインデックスとして:

mat( i, j ) = 4;

Matlabで変数名として使用してはいけないのはなぜですか?


5
もちろんフラグを立てることはしませんが、回答から判断すると、これは「主に意見に基づく」ものだと思います。;-)私は個人的にはあきらめないだろうijk一般的なループ変数名として。
A.ドンダ2015

1
@ A.Dondaよく、これはあなたの意見です;)
Shai

@Shai、これがこの質問の最後の文です。「Matlabで変数名として使用しないのはなぜですか?」それで、なぜあなたが私の版をあなたの質問で拒絶するのかは非常に不明確ですか?タイトルをより建設的なタイトルに変更しました。「Matlabで変数としてiとjを使用すべきではない理由」
Seyfi

回答:


176

なぜならij表す両方の機能である虚数単位

したがって、変数がそれらを呼び出すij、オーバーライドして、複雑な計算を行うコードを暗黙のうちに破壊する可能性があります。

可能な解決策としては、代わりにiiand jjasループ変数を使用するか、虚数単位を表すために必要な1iときにいつでも使用することiが挙げられます。


42
また、何も壊していない場合でも、iおよびj変数名を解決するために実行時間が犠牲になることにも注意してください。
Eitan T

14
@エイタン:JITでコンパイルされたMatlabのバージョンで具体的な決定的な方法で実際にそれをバックアップできますか?私はそれがそうであることを発見したことがありません(そして、forループを10億回呼び出す単純なテストはタイミングに統計的な違いを示さない)。これを正確に処理するための特別なコードがあり、iand j(およびk?)以外の変数を使用すると、実際には少し遅くなります。そして、実際に存在する違いはごくわずかです。単に使用しない理由はありませんiし、j通常の変数は、ちょうど他のMATLAB関数と同じように適切に使用する必要が-theyように。
horchler 2013年

5
@horchlerまあ、公式ドキュメントは述べるここで、標準のMATLABデータのクラスをオーバーライドする「負のパフォーマンスに影響を与える可能性」という、そしてここで堅牢性だけでなく、スピードの理由のために複雑な定数を上書きを避けるために暗示されます。でR2009bの古いドキュメントこれはJIT加速を妨げる可能性があるとして、それは明示的に、複雑な定数をオーバーライドに対して推奨されます。変数の名前解決はおそらくごくわずかですが、何百万回も繰り返された場合には重要になる可能性があります。
Eitan T

14
多分Matlabの古いバージョンでは。私自身もそれを見ていました。しかし、少なくともR2012a +(OS X)ではもうありません。また、forループを10億回呼び出して、あらゆる方法でタイミングスキームを試しても、違いはありませんでした。ループを繰り返し使用ijているため、完全に有効なコードは間違っているという新しいSOユーザーが見られるのを目にしています。率直に言って、それはばかげているだけであり、人々はこの質問のより重要なポイントを見逃しています。それはij読みやすい最新のMatlabコードを書きたい場合、虚数単位に使用するべきではありません。
horchler 2013年

12
私の主な時間の節約は、iiを検索するときです。iを検索するのは
大変です

62

変数や虚数単位であることを混同しないようにij変数を回避することをお勧めします。

ただし、個人的には、変数として、短いループのインデックスとして頻繁に使用ijます。私自身のコード内の問題を回避するために、私はに関する別の良いプラクティスに従うiとはjいない虚数を表すためにそれらを使用しています。実際、Matlab自身のドキュメントは次のように述べています

速度と堅牢性の向上のために、complex iおよびjbyを置き換えることができます1i

したがって、競合する可能性があるために2つの非常に一般的に使用される変数名を回避するのではなく、虚数について明示します。また、コードがより明確になります。私が見るときはいつでも、それが変数ではない可能性があるため、それが1i表すsqrt(-1)ことを知っています。


2
使用することは確かに良い習慣1iです。ただし、iおよびの意味を変更すると、このjようなデバッグが難しいエラーが発生する可能性があります。
シャイ

1
@Shai良い点。私は回避することを確認するために私の答えを微調整iし、j最高のですが、私の個人的なコーディングスタイルは、そのルールに従わない方法を説明しました。
シューザー

2
スピードが言及したことに注意が非常に重要ではないようです:stackoverflow.com/questions/18163454/...
デニスJaheruddin

完全に同意する!良い方法は、常に使用すること1iでありi、複雑な数学には使用しないでください。虚数を考え、虚数を悪い習慣1iとしましょうi。その逆ではありません。使用してiiiiiiMATLABで一般的に行われていると人々はに固執問題がない1i1j複素数のためには。また、Matlabはこれを尊重し、以前の回答で述べたように、これは(私がテストした限り)パフォーマンスを低下させません。
SdidS 2017

いずれにせよ、iとjは使用しないでください。これらの数字は意味を表します -目的を説明する名前を使用してください(row_n、elementNo、listItemIndexなど)。だから、はるかに簡単などのデバッグに、何をしているかを理解するために誰かのために費やした余分な時間がより使い捨てのスクリプトよりも価値よりも何のための長期的な保守性のゲインである-でもMatlabのエディタが背景にある幸福と他のほとんどの最新のIDE。
LightCC、

27

以前のバージョンのMATLABでは、変数名ij変数名としての使用を回避するのに十分な理由がありました。MATLABJITの初期バージョンは、それらを変数として使用するのか、虚数単位として使用するのかを判断するのに十分ではなかったため、他の多くの可能な最適化をオフにします。

したがって、コードが変数として存在するだけでコードが遅くiなりj、変数を別のものに変更するとスピードが向上します。そのため、多くのMathWorksコードを読むiijj、ループインデックスとしてかなり広く使用されます。しばらくの間、MathWorksは非公式に人々に自分でそれを行うようにアドバイスすることさえありました(ただし、現在のJITが行うバージョンではなく、エレガントで保守性の高いプログラムを人々に公式に勧めています)。

しかし、それはかなり昔のことであり、今日では、「ゾンビ」の問題であり、多くの人が考えているよりもはるかに重要ではありませんが、死ぬことを拒否しています。

最近のバージョンでは、それは実際に使用するかどうか個人的な好みだij変数名やないと。複雑な数値で多くの作業を行う場合は、変数として、または混乱の小さな潜在的なリスクを回避するためij、変数として使用することをお勧めします(ただし、/または代わりに使用する1i1j、または混乱を少なくし、パフォーマンスを少し向上させることもできます))。

一方、私の典型的な作業では、複素数を扱うことはなく、ループインデックスとして自由に使用できるiと、コードが読みやすくなりjます。


私はここに「お勧めできません...」と言っている答えがたくさんあります。以下は、現在のリリースドキュメントからのMathWorksの実際の推奨事項の範囲ですi

iは関数なので、オーバーライドして変数として使用できます。ただし、複雑な算術演算で使用する場合は、変数名にiとjを使用しないことをお勧めします。[...]速度と堅牢性を向上させるために、複雑なiとjを1iに置き換えることができます。


15

他の回答で説明されているようにi、一般的なコードの使用は、次の2つの理由で推奨されていません。

  • 虚数を使用したい場合は、インデックスと混同されるか、インデックスによって上書きされる可能性があります
  • インデックスとして使用すると、見落とされたり、虚数と混同されたりする可能性があります。

提案されているとおり:1iii推奨されます。ただし、これらはどちらもからの細かい変更iですが、これらの両方を一緒に使用するのはあまり良くありません。

(個人的に)嫌いな例を以下に示します。

val2 = val + i  % 1
val2 = val + ii % 2
val2 = val + 1i % 3

1つは2つまたは3つに読み間違えにくいでしょうが、2つと3つは互いに似ています。

したがって、私の個人的な推奨事項は次のとおり1iです。複雑なコードを使用する場合は、常に別のループ変数と組み合わせて使用します。

あなたは多くのループ変数や手紙で十分に使用しない場合のために、単一の文字指標の例:tukおよびp

長い指標の例:i_loopstepwalk、およびt_now

もちろんこれは個人の好みの問題でもありますが、あまり長く成長せずに明確な意味を持つ使用するインデックスを見つけることは難しくありません。


1
1iは虚数単位を示します(Matlab変数名も数字で始めることはできません)
lib

2
@DennisJaheruddin:恥知らずなプラグイン:スタックオーバーフロー用のMATLAB構文強調表示ユーザースクリプトを使用します。最後の例で1iは、数字で色分けされます:)
Amro

2
doc iand from doc j:「速度と堅牢性の向上のために、複雑なiとjを1iに置き換えることができます。」IMO、現在のMatlabでは、ループなどで使用しない理由iや、虚数単位を表すj以外の方法を使用する理由はありません1i1j動作します)。唯一の例外は、常にわずかに互換性のないシンボリックエンジンに文字列を渡す場合です。奇妙なことですがhelp 1i、機能doc 1iしません。
horchler 2013年

11

これ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とき、私は複素数を使用する必要があります。


2
「違い見に難しいことができます1iiiの間に、さらに違い」1lとの間Oとを0。そのため、MATALBの新規インストールで最初に行うステップは、デフォルトのフォントサイズを変更することです。
glglgl 2014

6

虚数単位との混同についてはここで十分に説明しましたが、これらおよび他の1文字の変数名が時々推奨されない理由が他にもあります。

  1. 特にMATLAB:コーダーを使用してMATLABコードからC ++ソースを生成している場合(そうしないでください、それは恐ろしいことです)、潜在的な型の衝突のために変数を再利用しないように明示的に警告されます。

  2. 一般的に、IDEによっては、1文字の変数名が蛍光ペンや検索/置換で混乱を招く可能性があります。MATLABはこれに悩まされることはなく、Visual Studioにはしばらく問題がなかったと思いますが、MISRAなどのC / C ++コーディング標準はそれらについて再度アドバイスする傾向があります。

私の部分では、数学的ソースを直接実装することの明らかな利点にもかかわらず、1文字の変数はすべて避けています。最初の数百回は少し余分な労力がかかりますが、その後は気付かなくなり、あなたや他の貧しい魂がコードを読むようになるときの利点は軍団です。


4

重要なコードには複数のforループが含まれており、ベストプラクティスでは、その目的と範囲を示すわかりやすい名前を使用することをお勧めします。(私は保存するつもりはないということと、その5-10ラインスクリプトでない限り)太古の時間のために、私はいつものように、変数名を使用しているidxTaskidxAnotherTaskidxSubTaskなど

または、配列の最初の文字を少なくとも2倍にすると、たとえばssindex subjectListやindex などttにインデックスが作成されますtaskListが、そうでないii場合、またはjj複数のforループからインデックスを作成している配列を簡単に特定するのに役立ちません。


3

デフォルトijは、虚数単位を表します。したがって、MATLABの観点からiは、変数として使用することは1、変数として使用することに似ています。


5
そんなことはないと思います。iは正当な変数名なので、実際にはiとjを変数名として使用できます。以前の回答で述べたように、架空の意味が隠されてしまいます。1は正当な変数名ではありません。複素数を使用しない場合は、まったく問題ありません。
2013

@thangだから私は「好き」ではなく「好き」と言った。私は違いがあることを知っています。OPはなぜ使用してはいけないのかと尋ねましたが、すでに数値を表現しているためだと説明しようとしました。
yo '

2
わかりました。申し訳ありませんが、どういう意味かわかりません。私にとっては、明らかに1を変数として使用することはできないので、明らかに異なります。でも、どこから来たのかはわかります。
タン

あなたはできますが、また、変数のための既存の関数名を使用(と同時に、さらに使用するために、これらの組み込み関数/定数を破損する)ことができますように、それらを使用しています。あなたが本当にそれを望んでいるかどうかは別のものです(
imo

1
申し訳ありませんが、この説明は意味がありません。iそしてj実際虚数部の値を返す関数です。スコープ内の関数と同じ名前の変数を使用できます。ただし、これは関数をシャドウします。
patrik 2015年

2

非常に混乱しているユーザーでない限り、変数名ijを使用してもリスクはほとんどないと私は思います。私はそれらを定期的に使用しています。このような行為は避けるべきだという公式な指摘は見ていません。

他の投稿で述べられているように、架空のユニットをシャドウイングすることは、一部のコンテキストで混乱を引き起こす可能性があることは事実ですが、全体として私はそれを大きな問題とは見なしていません。たとえば、MATLABで定義すると、混乱が生じやすくなります。false=true

私の意見では、おそらくそれらを回避する必要があるのは、コードが特に虚数を扱う場合だけです。


反対投票の際にコメントしてください。たとえば、Mathworksのリンクに、そのプラクティスが推奨されていないことを示している(公式ガイドラインを参照せずに複数のポスターで述べられている)。実際、ループで 'i'を使用することは、Mathworksの公式の例で使用されています。私の経験では、コードは明確かつ簡潔で、非常に一般的な方法です。
gregswiss 2015年

1
引用文書「以来i関数であり、それがオーバーライドし、変数として使用することができます。しかし、それは使用を避けるのが最善であるijは、複雑な演算でそれらを使用する場合は、変数名のために。」それは、オリバーの回答に関するEitan Tのコメント(彼はそれを計ったと思う)と併せて、十分な証拠のようです。
Adriaan

1
また、@ Adriaan からのコメントによる2013年の回答はすでにあります
Andras Deak

1
したがって、ドキュメントには、複雑な算術で使用する場合は記載されていますが、そうでない場合は適用されません-ここで誰もがそれについてそれほどうるさいのはなぜかわかりません!私は別の見方をしていました。
gregswiss 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.