在Matlab中使用i和j作为variables
i
和j
是非常stream行的variables名称(例如,见这个问题和这个 )。
例如,在循环中:
for i=1:10, % do something... end
作为matrix的指标:
mat( i, j ) = 4;
为什么不能在Matlab中用作variables名?
因为i
和j
都是表示虚数单位的函数:
所以一个名为i
或j
的variables会覆盖它们,可能默默无闻地破坏复杂math的代码。
可能的解决scheme包括使用ii
和jj
作为循环variables,或者每当i
需要表示虚数单元时使用1i
。
避免i
和j
variables是避免混淆variables或虚数单元的好办法。
然而,就个人而言,我经常使用i
和j
作为variables的短循环索引。 为了避免在我自己的代码中出现问题,我遵循另一个关于i
和j
好习惯: 不要用它们表示虚数。 事实上, Matlab自己的文档指出 :
为了提高速度和提高鲁棒性,可以用
1i
代替复杂的i
和j
。
所以,由于潜在的冲突,而不是避免使用两个非常常用的variables名,所以我对于虚数很明确。 这也使我的代码更清晰。 任何时候我看到1i
,我知道它代表sqrt(-1)
因为它不可能是一个variables。
在旧版本的MATLAB中,曾经有一个很好的理由避免使用i
和j
作为variables名称 – MATLAB JIT的早期版本并不足以告诉您将它们用作variables还是虚拟单元,会因此closures许多其他可能的优化。
因此,你的代码会因为i
和j
variables的存在而变慢,如果你把它们改成别的东西,速度会加快。 这就是为什么如果你读了很多MathWorks的代码,你会发现ii
和jj
被广泛用作循环索引。 一段时间以来,MathWorks甚至可能会非正式地build议人们这样做(尽pipe他们总是正式build议人们为了优雅/可维护性而不是目前的JIT所做的事情,因为它是每个版本的移动目标)。
但是那已经是很久以前的事了,现在这个“僵尸”问题比许多人还想象的要重要得多,但是却不肯死。
在任何最近的版本中,是否使用i
和j
作为variables名是个人偏好。 如果你用复数做很多工作,你可能想避免i
和j
作为variables,以避免任何小的潜在混淆风险(尽pipe你也可能/而不是仅仅使用1i
或1j
来减less混淆,性能稍好一点)。
另一方面,在我的典型工作中,我从不处理复杂的数字,如果我可以自由地使用i
和j
作为循环索引,我发现我的代码更具可读性。
我在这里看到很多答案, 不build议……不说谁在做推荐。 以下是MathWorks实际build议的范围,从当前版本的i
:
由于我是一个函数,它可以被重写并用作一个variables。 但是,如果您打算在复数运算中使用它们,则最好避免将i和j用于variables名称。 […]为了提高速度和提高鲁棒性,可以用1i代替复杂的i和j。
正如其他答案中所述,不build议在通用代码中使用i
,原因有两个:
- 如果要使用虚数,可以将其与索引混淆或覆盖
- 如果你用它作为索引,它可能会缠绕或与虚数混淆
build议如下: 1i
和ii
是推荐的。 但是,尽pipe这些都与i
有很大的偏差,但是将这两种替代方法结合在一起并不是很好。
这是一个例子,为什么(个人)我不喜欢它:
val2 = val + i % 1 val2 = val + ii % 2 val2 = val + 1i % 3
一个人不容易被误解为两三个,但两个和三个彼此相似。
因此,我个人的build议是:如果你有时使用复杂的代码,总是使用1i
结合不同的循环variables。
单字母索引的例子,如果你不使用许多循环variables和字母就足够了: t
, u
, k
和p
较长索引的示例: i_loop
, step
, walk
和t_now
当然,这也是一个个人品味的问题,但要find具有明确含义而又不会太长的指标是不难的。
有人指出, 1i
是写入sqrt(-1)
的可接受且毫不含糊的方式,因此不需要避免使用i
。 再如丹尼斯所指出的( https://stackoverflow.com/a/14893729/1967396 ),很难看出1i
和ii
之间的区别。 我的build议是:尽可能使用1j
作为虚数。 这与电气工程师使用的技巧是一样的 – 他们使用j
表示sqrt(-1)
因为i
已经采用了电stream 。
我个人从不使用i
和j
; 当我需要使用复数时,我使用ii
和jj
作为速记索引variables(和kk,ll,mm,…)和1j
。
与虚构单位的混淆已经在这里得到了很好的覆盖,但还有一些其他更为平淡的原因,为什么这些和其他单个字母的variables名称有时是不鼓励的。
-
MATLAB特别是:如果你使用编码器从你的MATLAB代码生成C ++源代码(不要,这太可怕了),那么你明确的警告不要重复使用variables,因为潜在的键入冲突。
-
通常,根据您的IDE,单字母variables名称可能会导致荧光笔和search/replace造成严重破坏。 MATLAB不会受到这个,我相信Visual Studio已经有一段时间没有问题,但是像MISRA等C / C ++编码标准倾向于build议他们。
就我而言,我避免了所有单字母variables,尽pipe直接实现math来源有明显的优势。 在开始的几百次之前,你需要花费一些额外的努力,但是之后你不会注意到,当你或者其他可怜的灵魂来读你的代码的时候,优点就是军团。
任何不重要的代码都包含多个for
循环,最佳做法build议您使用一个描述性名称来指示其用途和范围。 对于远古时代(除非它的5-10行脚本,我不会保存),我一直使用像idxTask
, idxAnotherTask
和idxSubTask
等variables名称。
或者至less在数组的第一个字母加倍,它是索引例如ss
索引subjectList
,索引taskList
,但不是ii
或jj
,这不帮助我毫不费力地确定他们索引出我的多个for循环。
默认情况下, i
和j
代表虚数单位。 所以从MATLAB的angular度来看,使用i
作为variables有点像使用1
作为variables。
除非你是一个非常困惑的用户,我认为使用variables名i和j的风险非常小,我经常使用它们。 我还没有看到任何正式的迹象表明这种做法应该避免。
虽然在其他文章中提到的假想单位的阴影可能会造成一些混乱,但总的来说,我并不认为这是一个大问题。 MATLAB中可以做更多令人困惑的事情,例如定义false=true
在我看来,如果你的代码专门处理虚数,唯一的时候你应该避免它们。