在Matlab中使用i和j作为variables

ij是非常stream行的variables名称(例如,见这个问题和这个 )。

例如,在循环中:

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

作为matrix的指标:

 mat( i, j ) = 4; 

为什么不能在Matlab中用作variables名?

因为ij都是表示虚数单位的函数:

所以一个名为ij的variables会覆盖它们,可能默默无闻地破坏复杂math的代码。

可能的解决scheme包括使用iijj作为循环variables,或者每当i需要表示虚数单元时使用1i

避免ijvariables是避免混淆variables或虚数单元的好办法。

然而,就个人而言,我经常使用ij作为variables的短循环索引。 为了避免在我自己的代码中出现问题,我遵循另一个关于ij好习惯: 不要用它们表示虚数。 事实上, Matlab自己的文档指出 :

为了提高速度和提高鲁棒性,可以用1i代替复杂的ij

所以,由于潜在的冲突,而不是避免使用两个非常常用的variables名,所以我对于虚数很明确。 这也使我的代码更清晰。 任何时候我看到1i ,我知道它代表sqrt(-1)因为它不可能是一个variables。

在旧版本的MATLAB中,曾经有一个很好的理由避免使用ij作为variables名称 – MATLAB JIT的早期版本并不足以告诉您将它们用作variables还是虚拟单元,会因此closures许多其他可能的优化。

因此,你的代码会因为ijvariables的存在而变慢,如果你把它们改成别的东西,速度会加快。 这就是为什么如果你读了很多MathWorks的代码,你会发现iijj被广泛用作循环索引。 一段时间以来,MathWorks甚至可能会非正式地build议人们这样做(尽pipe他们总是正式build议人们为了优雅/可维护性而不是目前的JIT所做的事情,因为它是每个版本的移动目标)。

但是那已经是很久以前的事了,现在这个“僵尸”问题比许多人还想象的要重要得多,但是却不肯死。

在任何最近的版本中,是否使用ij作为variables名是个人偏好。 如果你用复数做很多工作,你可能想避免ij作为variables,以避免任何小的潜在混淆风险(尽pipe你也可能/而不是仅仅使用1i1j来减less混淆,性能稍好一点)。

另一方面,在我的典型工作中,我从不处理复杂的数字,如果我可以自由地使用ij作为循环索引,我发现我的代码更具可读性。


我在这里看到很多答案, 不build议……不说谁在做推荐。 以下是MathWorks实际build议的范围,从当前版本的i

由于我是一个函数,它可以被重写并用作一个variables。 但是,如果您打算在复数运算中使用它们,则最好避免将i和j用于variables名称。 […]为了提高速度和提高鲁棒性,可以用1i代替复杂的i和j。

正如其他答案中所述,不build议在通用代码中使用i ,原因有两个:

  • 如果要使用虚数,可以将其与索引混淆或覆盖
  • 如果你用它作为索引,它可能会缠绕或与虚数混淆

build议如下: 1iii是推荐的。 但是,尽pipe这些都与i有很大的偏差,但是将这两种替代方法结合在一起并不是很好。

这是一个例子,为什么(个人)我不喜欢它:

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

一个人不容易被误解为两三个,但两个和三个彼此相似。

因此,我个人的build议是:如果你有时使用复杂的代码,总是使用1i结合不同的循环variables。

单字母索引的例子,如果你不使用许多循环variables和字母就足够了: tukp

较长索引的示例: i_loopstepwalkt_now

当然,这也是一个个人品味的问题,但要find具有明确含义而又不会太长的指标是不难的。

有人指出, 1i是写入sqrt(-1)的可接受且毫不含糊的方式,因此不需要避免使用i 。 再如丹尼斯所指出的( https://stackoverflow.com/a/14893729/1967396 ),很难看出1iii之间的区别。 我的build议是:尽可能使用1j作为虚数。 这与电气工程师使用的技巧是一样的 – 他们使用j表示sqrt(-1)因为i已经采用了电stream 。

我个人从不使用ij ; 当我需要使用复数时,我使用iijj作为速记索引variables(和kk,ll,mm,…)和1j

与虚构单位的混淆已经在这里得到了很好的覆盖,但还有一些其他更为平淡的原因,为什么这些和其他单个字母的variables名称有时是不鼓励的。

  1. MATLAB特别是:如果你使用编码器从你的MATLAB代码生成C ++源代码(不要,这太可怕了),那么你明确的警告不要重复使用variables,因为潜在的键入冲突。

  2. 通常,根据您的IDE,单字母variables名称可能会导致荧光笔和search/replace造成严重破坏。 MATLAB不会受到这个,我相信Visual Studio已经有一段时间没有问题,但是像MISRA等C / C ++编码标准倾向于build议他们。

就我而言,我避免了所有单字母variables,尽pipe直接实现math来源有明显的优势。 在开始的几百次之前,你需要花费一些额外的努力,但是之后你不会注意到,当你或者其他可怜的灵魂来读你的代码的时候,优点就是军团。

任何不重要的代码都包含多个for循环,最佳做法build议您使用一个描述性名称来指示其用途和范围。 对于远古时代(除非它的5-10行脚本,我不会保存),我一直使用像idxTaskidxAnotherTaskidxSubTask等variables名称。

或者至less在数组的第一个字母加倍,它是索引例如ss索引subjectList ,索引taskList ,但不是iijj ,这不帮助我毫不费力地确定他们索引出我的多个for循环。

默认情况下, ij代表虚数单位。 所以从MATLAB的angular度来看,使用i作为variables有点像使用1作为variables。

除非你是一个非常困惑的用户,我认为使用variables名ij的风险非常小,我经常使用它们。 我还没有看到任何正式的迹象表明这种做法应该避免。

虽然在其他文章中提到的假想单位的阴影可能会造成一些混乱,但总的来说,我并不认为这是一个大问题。 MATLAB中可以做更多令人困惑的事情,例如定义false=true

在我看来,如果你的代码专门处理虚数,唯一的时候你应该避免它们。