i
并且j
是非常流行的变量名称(例如,参见这个问题和这个问题)。
例如,在循环中:
for i=1:10,
% Do something...
end
作为矩阵的索引:
mat(i, j) = 4;
为什么不应该将它们用作 MATLAB 中的变量名?
因为i
和j
都是表示虚数单位的函数:
因此,一个名为i
or的变量j
将覆盖它们,可能会默默地破坏执行复杂数学的代码。
可能的解决方案包括使用ii
andjj
作为循环变量,或者使用1i
需要i
表示虚数单位的任何时候。
避免变量是一种很好的做法,i
以j
防止混淆它们是变量还是虚数单位。
然而,就我个人而言,我经常使用i
和作为变量作为短循环的索引。j
为了避免我自己的代码出现问题,我遵循了另一个关于i
and的好习惯j
:不要用它们来表示虚数。事实上,MATLAB 自己的文档指出:
为了速度和提高鲁棒性,您可以将 complex
i
和替换j
为1i
.
因此,我没有因为潜在的冲突而避免使用两个非常常用的变量名称,而是明确地谈论虚数。它也使我的代码更清晰。任何时候我看到1i
,我都知道它代表sqrt(-1)
,因为它不可能是一个变量。
在旧版本的 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
当然,这也是个人喜好问题,但不难找到可以使用且具有明确含义且不会增长太久的索引。
这里已经很好地说明了与虚数单位的混淆,但还有一些其他更平淡无奇的原因有时不鼓励使用这些和其他单字母变量名称。
特别是 MATLAB:如果您使用 coder 从您的 MATLAB 代码生成 C++ 源代码(不要,这太可怕了),那么您会被明确警告不要重用变量,因为可能会发生类型冲突。
通常,根据您的 IDE,单字母变量名可能会对荧光笔和搜索/替换造成严重破坏。MATLAB 不受此影响,我相信 Visual Studio 已经有一段时间没有问题了,但是像MISRA等 C/C++ 编码标准倾向于反对它们。
就我而言,我避免使用所有单字母变量,尽管直接实现数学源有明显的优势。前几百次需要额外的努力,但之后你就不再注意到了,当你或其他一些可怜的灵魂来阅读你的代码时,优势是无穷无尽的。
默认情况下i
,j
代表虚数单位。因此,从 MATLAB 的角度来看,i
用作变量在某种程度上就像1
用作变量一样。
任何重要的代码都包含多个for
循环,最佳实践建议您使用指示其目的和范围的描述性名称。在远古时代(除非我不会保存它的 5-10 行脚本),我一直在使用变量名,比如idxTask
,idxAnotherTask
等等idxSubTask
。
或者至少将它正在索引的数组的第一个字母加倍,例如ss
索引subjectList
,tt
索引taskList
,但不是ii
或jj
不能帮助我毫不费力地从我的多个 for 循环中识别出它们正在索引的数组。
除非您是一个非常困惑的用户,否则我认为使用变量名i和j的风险很小,并且我经常使用它们。我没有看到任何官方迹象表明应该避免这种做法。
虽然在其他帖子中提到的某些情况下,遮蔽虚数单位确实会引起一些混乱,但总的来说,我根本不认为这是一个主要问题。您可以在 MATLAB 中做更多令人困惑的事情,例如定义false=true
在我看来,您唯一应该避免使用它们的情况是您的代码专门处理虚数。