Answers:
i
和j
变量名。
for
10亿次循环的简单测试显示,时序没有统计差异)。我们都知道有特殊的代码来处理的正是这种和使用比其他变量i
和j
(和k
?)实际上是稍微慢一些。确实存在的差异在现实生活中微不足道,甚至不存在。根本没有理由不使用它,i
并且将它们j
作为常规变量使用-只需像其他任何Matlab函数一样正确使用它们即可。
for
10亿次循环并尝试各种计时方案时,我看不出有什么区别。我看到新的SO用户被告知完全有效的代码是错误的,因为他们正在使用i
和j
迭代循环。坦率地说这只是愚蠢和人失踪这个问题的更重要的一点:i
和j
甚至不应该被用于虚数单位如果想要写可读的现代Matlab代码。
避免i
和避免j
变量混淆是一个好习惯,因为它们是变量或虚数单位。
但是,就我个人而言,我经常将i
和j
作为变量用作短循环的索引。为了避免我自己的代码中出现问题,我遵循了关于i
和的另一种良好做法j
:请勿使用它们来表示虚数。实际上,Matlab自己的文档指出:
对于速度和改进的鲁棒性,可以取代复杂的
i
和j
通过1i
。
因此,我没有因为潜在的冲突而避免使用两个非常常用的变量名,而是明确地介绍了虚数。这也使我的代码更加清晰。每当我看到时1i
,我就知道它代表了,sqrt(-1)
因为它不可能是变量。
i
和j
最好,但解释了我的个人编码风格如何不遵循该规则。
1i
而不是i
复杂的数学。让我们把虚数看作是一个不好的做法1i
,把i
虚数当作虚数。并非相反。使用i
,ii
,iii
是在Matlab常见的做法,有当人们坚持没有问题1i
,并1j
为复数。Matlab也尊重这一点,并且这不会降低性能(据我测试),正如先前答案中所述。
在旧版本的MATLAB中,曾经有一个很好的理由避免使用i
和j
作为变量名-早期版本的MATLAB JIT不够聪明,无法告诉您是将它们用作变量还是虚数单位,因此会关闭许多其他可能的优化。
因此,仅由于存在i
和j
作为变量,您的代码就会变慢,如果将其更改为其他变量,则代码会加快速度。这就是为什么,如果您阅读了很多MathWorks代码,就会发现ii
并jj
广泛用作循环索引。有一阵子,MathWorks甚至可能非正式地建议人们自己去做(尽管他们总是正式建议人们去编程,以求优雅/可维护性,而不是为当前的JIT做任何事情,因为它是每个版本的目标)。
但这是很久以前的事了,如今它有点“僵尸”问题,其重要性远不如许多人想象的那么重要,但拒绝死亡。
在任何最新版本中,是否使用i
和j
作为变量名实际上都是个人喜好。如果您对复数进行大量工作,则可能需要避免i
和j
作为变量使用,以避免任何小的潜在混淆风险(尽管您可能也/反而只想使用1i
或1j
为了减少混淆,而又想获得更好的性能) )。
另一方面,在我的典型工作中,我从不处理复数,如果可以随意使用i
和j
作为循环索引,我发现我的代码更具可读性。
我在这里看到很多回答,说“ 不推荐...”,而不是说谁在做这个推荐。以下是当前版本文档中MathWorks实际建议的范围i
:
由于i是一个函数,因此可以覆盖它并将其用作变量。但是,如果要在复杂的算术中使用它们,最好避免使用i和j作为变量名。为了提高速度和增强鲁棒性,您可以将复数i和j替换为1i。
如其他答案所述,由于i
以下两个原因,不建议使用通用代码:
如建议:1i
和ii
推荐。但是,尽管它们都与都有微小的偏差i
,但同时使用这两种方法并不是很好。
这是一个为什么我个人不喜欢的示例:
val2 = val + i % 1
val2 = val + ii % 2
val2 = val + 1i % 3
一两个或三个不会轻易误读,但两个和三个彼此相似。
因此,我个人的建议是:如果您有时使用复杂的代码,请始终1i
将其与其他循环变量结合使用。
对于如果你不使用许多循环变量和字母就够了单个字母索引的例子:t
,u
,k
和p
更长的指数例如:i_loop
,step
,walk
,和t_now
当然,这也是个人喜好问题,但是在不增长太长时间的情况下,不难找到具有明确含义的索引。
doc i
和doc j
:“为了提高速度和增强的鲁棒性,可以将复数i和j替换为1i。” IMO,在当前的Matlab中,没有理由不使用i
而不是j
在循环中等,或使用除1i
表示虚数单位以外的任何方式使用(1j
也可以使用)。唯一的例外是将字符串传递到始终略微不兼容的Symbolic引擎时。奇怪的是,help 1i
并doc 1i
没有工作,虽然。
有人指出,这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
。
1i
与ii
”甚至更多的差异1
和l
之间O
和0
。这就是为什么我在全新的MATALB安装中要做的第一步就是更改默认字体大小。
与虚构单元的混淆已在此处得到了很好的论述,但是还有其他一些比较平淡的原因,有时不鼓励使用这些名称以及其他单字母变量名称。
特别是MATLAB:如果您正在使用编码器从MATLAB代码生成C ++源代码(不要这样,那太可怕了),那么会明确警告您不要重复使用变量,因为可能会发生类型冲突。
通常,根据您的IDE,单字母变量名称可能会导致荧光笔和搜索/替换的混乱。MATLAB并不会因此而受苦,我相信Visual Studio已有一段时间没有出现问题了,但是MISRA等C / C ++编码标准倾向于向他们提出建议。
就我而言,尽管直接实现数学源具有明显优势,但我还是避免了所有单字母变量。最初几百遍,这会花费一些额外的精力,但此后您就不再注意到了,当您或其他可怜的灵魂来阅读代码时,它的好处是无数。
任何非平凡的代码都包含多个for
循环,最佳实践建议您使用表示其目的和范围的描述性名称。对于远古时代(除非它的5〜10行,我救不了),我一直使用的变量名一样idxTask
,idxAnotherTask
和idxSubTask
等。
或者至少将ss
要索引的数组的第一个字母加倍,例如subjectList
,tt
将index 索引到index taskList
,但不是,ii
或者jj
这没有帮助我毫不费力地从my for循环中识别出它们正在索引哪个数组。
默认情况下i
,j
代表虚构单位。因此,从MATLAB的角度来看,使用i
变量就像使用1
变量一样。
i
和j
实际上是返回虚数单位的值的函数。可以在作用域中使用与函数同名的变量。但是,这将使功能蒙上阴影。
除非您是一个非常困惑的用户,否则我认为使用变量名i和j的风险很小,而且我会定期使用它们。我没有看到任何官方迹象表明应避免这种做法。
正如在其他帖子中提到的那样,对虚构单元进行阴影处理确实会在某些情况下引起某些混乱,但总的来说,我只是认为它不是主要问题。您可以在MATLAB中做更多令人困惑的事情,例如定义false=true
在我看来,唯一可能应该避免使用它们的地方是,如果您的代码专门处理虚数。
i
是一个函数,因此可以重写它并用作变量。但是,如果要在复杂的算术中使用它们,最好避免使用i
和j
作为变量名。” 结合Eitan T对Oliver的回答的评论(我想他是定时的),这似乎是充分的证明。
i
,j
,k
作为通用的循环变量名。