144

i并且j是非常流行的变量名称(例如,参见这个问题这个问题)。

例如,在循环中:

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

作为矩阵的索引:

mat(i, j) = 4;

为什么不应该将它们用作 MATLAB 中的变量名?

4

9 回答 9

178

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

因此,一个名为ior的变量j将覆盖它们,可能会默默地破坏执行复杂数学的代码。

可能的解决方案包括使用iiandjj作为循环变量,或者使用1i需要i表示虚数单位的任何时候。

于 2013-02-09T19:40:15.840 回答
66

避免变量是一种很好的做法,ij防止混淆它们是变量还是虚数单位。

然而,就我个人而言,我经常使用i和作为变量作为短循环的索引。j为了避免我自己的代码出现问题,我遵循了另一个关于iand的好习惯j不要用它们来表示虚数。事实上,MATLAB 自己的文档指出

为了速度和提高鲁棒性,您可以将 complexi和替换j1i.

因此,我没有因为潜在的冲突而避免使用两个非常常用的变量名称,而是明确地谈论虚数。它也使我的代码更清晰。任何时候我看到1i,我都知道它代表sqrt(-1),因为它不可能是一个变量。

于 2013-02-13T19:02:27.590 回答
31

在旧版本的 MATLAB 中,曾经有一个很好的理由来避免使用ij作为变量名 - 早期版本的 MATLAB JIT 不够聪明,无法判断您是使用它们作为变量还是作为虚数单位,因此会关闭许多其他可能的优化。

因此,您的代码会因为ij作为变量的存在而变慢,如果您将它们更改为其他内容,则会加快速度。这就是为什么如果您通读大量 MathWorks 代码,您会看到iijj广泛使用循环索引。有一段时间,MathWorks 甚至可能非正式地建议人们自己做这件事(尽管他们总是正式建议人们为优雅/可维护性而编程,而不是按照当前 JIT 所做的任何事情,因为它是每个版本的移动目标)。

但那是很久以前的事了,现在它有点像“僵尸”问题,实际上比许多人仍然认为的要重要得多,但它拒绝死去。

在任何最近的版本中,是否使用ij作为变量名确实是个人偏好。如果您对复数进行大量工作,您可能希望避免使用ij作为变量,以避免任何小的潜在混淆风险(尽管您可能也/相反希望只使用1i1j更少混淆,并获得更好的性能)。

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


我在这里看到很多答案说不推荐......没有说谁在推荐。以下是 MathWorks 的实际建议范围,来自当前版本文档i

由于 i 是一个函数,它可以被覆盖并用作变量。但是,如果您打算在复数算术中使用变量名,最好避免使用 i 和 j。[...] 为了提高速度和提高鲁棒性,您可以将复数 i 和 j 替换为 1i。

于 2013-07-18T12:15:11.903 回答
16

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

  • 如果要使用虚数,它可能会与索引混淆或被索引覆盖
  • 如果您将其用作索引,它可能会覆盖或与虚数混淆

正如所建议的:1i并且ii被推荐。然而,尽管这些都是与 的细微偏差,但将这两种i替代方案一起使用并不是很好。

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

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

一个不容易被两个或三个误读,但两个和三个彼此相似。

因此我个人的建议是:如果您有时使用复杂的代码,请始终1i与不同的循环变量结合使用。

如果您不使用许多循环变量和字母就足够了的单字母索引示例:tukp

较长索引的示例:i_loopstepwalkt_now

当然,这也是个人喜好问题,但不难找到可以使用且具有明确含义且不会增长太久的索引。

于 2013-02-15T11:29:46.233 回答
12

有人指出,这1i是一种可接受且明确的编写方式sqrt(-1),因此没有必要避免使用i. 再说一次,正如丹尼斯指出的那样,很难看出 和 之间的1i区别ii。我的建议:1j尽可能用作虚常数。这与电气工程师使用的技巧相同——他们使用j的是sqrt(-1)因为i已经被用于当前

我个人从不使用iand j; 当我需要使用复数时,我使用iiandjj作为速记索引变量(以及 kk、ll、mm、...) 。1j

于 2013-06-20T21:47:33.007 回答
6

这里已经很好地说明了与虚数单位的混淆,但还有一些其他更平淡无奇的原因有时不鼓励使用这些和其他单字母变量名称。

  1. 特别是 MATLAB:如果您使用 coder 从您的 MATLAB 代码生成 C++ 源代码(不要,这太可怕了),那么您会被明确警告不要重用变量,因为可能会发生类型冲突。

  2. 通常,根据您的 IDE,单字母变量名可能会对荧光笔和搜索/替换造成严重破坏。MATLAB 不受此影响,我相信 Visual Studio 已经有一段时间没有问题了,但是像MISRA等 C/C++ 编码标准倾向于反对它们。

就我而言,我避免使用所有单字母变量,尽管直接实现数学源有明显的优势。前几百次需要额外的努力,但之后你就不再注意到了,当你或其他一些可怜的灵魂来阅读你的代码时,优势是无穷无尽的。

于 2015-04-29T12:51:47.103 回答
4

默认情况下ij代表虚数单位。因此,从 MATLAB 的角度来看,i用作变量在某种程度上就像1用作变量一样。

于 2013-02-09T19:40:15.417 回答
4

任何重要的代码都包含多个for循环,最佳实践建议您使用指示其目的和范围的描述性名称。在远古时代(除非我不会保存它的 5-10 行脚本),我一直在使用变量名,比如idxTask,idxAnotherTask等等idxSubTask

或者至少将它正在索引的数组的第一个字母加倍,例如ss索引subjectListtt索引taskList,但不是iijj不能帮助我毫不费力地从我的多个 for 循环中识别出它们正在索引的数组。

于 2015-12-31T15:20:01.637 回答
2

除非您是一个非常困惑的用户,否则我认为使用变量名ij的风险很小,并且我经常使用它们。我没有看到任何官方迹象表明应该避免这种做法。

虽然在其他帖子中提到的某些情况下,遮蔽虚数单位确实会引起一些混乱,但总的来说,我根本不认为这是一个主要问题。您可以在 MATLAB 中做更多令人困惑的事情,例如定义false=true

在我看来,您唯一应该避免使用它们的情况是您的代码专门处理虚数。

于 2015-09-14T07:37:42.673 回答