提问人:Shai 提问时间:2/10/2013 最后编辑:Peter MortensenShai 更新时间:3/24/2021 访问量:21435
在 MATLAB 中使用 i 和 j 作为变量
Using i and j as variables in MATLAB
问:
例如,in 循环:
for i=1:10,
% Do something...
end
作为矩阵中的索引:
mat(i, j) = 4;
为什么它们不应该在MATLAB中用作变量名称?
答:
默认情况下,代表虚数单位。因此,从MATLAB的角度来看,用作变量在某种程度上类似于用作变量。i
j
i
1
评论
i
j
因为 和 都是表示虚部的函数:i
j
因此,一个变量调用或将覆盖它们,可能会以静默方式破坏执行复杂数学运算的代码。i
j
可能的解决方案包括改用 and 作为循环变量,或者使用 whenever 来表示虚部单位。ii
jj
1i
i
评论
i
j
for
i
j
k
i
j
for
i
j
i
j
避免使用变量来防止混淆它们是变量或虚数单位是一种很好的做法。i
j
然而,就我个人而言,我经常使用 和 作为变量作为短循环的索引。为了避免在我自己的代码中出现问题,我遵循另一个关于 and 的好做法:不要用它们来表示虚数。事实上,MATLAB 自己的文档指出:i
j
i
j
为了提高速度和提高鲁棒性,您可以用 .
i
j
1i
因此,我没有因为潜在的冲突而避免使用两个非常常用的变量名称,而是明确使用虚数。这也使我的代码更加清晰。每当我看到 时,我就知道它代表了,因为它不可能是一个变量。1i
sqrt(-1)
评论
i
j
1i
i
1i
i
i
ii
iii
1i
1j
如其他答案中所述,不建议在常规代码中使用,原因有二: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
当然,这也是个人品味的问题,但应该不难找到具有明确含义的指数,而不会增长太长。
评论
1i
doc i
doc j
i
j
1i
1j
help 1i
doc 1i
有人指出,这是一种可接受且明确的书写方式,因此没有必要避免使用.话又说回来,正如丹尼斯所指出的,很难看出 和 之间的区别。我的建议:尽可能用作虚常数。这与电气工程师使用的技巧相同 - 他们用于因为已经用于电流。1i
sqrt(-1)
i
1i
ii
1j
j
sqrt(-1)
i
就我个人而言,我从不使用和;我使用 and 作为速记索引变量,(和 kk、ll、mm、...)以及当我需要使用复数时。i
j
ii
jj
1j
评论
1i
ii
1
l
O
0
在旧版本的 MATLAB 中,过去有充分的理由避免使用 and 作为变量名称 - 早期版本的 MATLAB JIT 不够聪明,无法判断它们是将它们用作变量还是虚构单位,因此会关闭许多其他可能的优化。i
j
因此,仅仅因为 和 作为变量的存在,你的代码就会变慢,如果你把它们改成其他东西,代码就会变慢。因此,如果您通读了大量 MathWorks 代码,就会看到并广泛地用作循环索引。有一段时间,MathWorks 甚至可能非正式地建议人们自己这样做(尽管他们总是正式建议人们进行编程以追求优雅/可维护性,而不是当前 JIT 所做的任何事情,因为它是每个版本的移动目标)。i
j
ii
jj
但那是很久以前的事了,现在它有点像一个“僵尸”问题,实际上远没有许多人认为的那么重要,但拒绝死亡。
在任何最新版本中,是否使用 and 作为变量名称实际上是个人偏好。如果你对复数做了大量工作,你可能希望避免 和 作为变量,以避免任何小的潜在混淆风险(尽管你可能也/相反只想使用 or 来减少混淆,以及更好的性能)。i
j
i
j
1i
1j
另一方面,在我的典型工作中,我从不处理复数,如果我觉得随意使用和作为循环索引,我发现我的代码更具可读性。i
j
我在这里看到很多答案说:不推荐......没有说谁在做那个推荐。以下是 MathWorks 在当前版本文档中提出的实际建议的范围:i
由于 i 是一个函数,因此可以将其覆盖并用作变量。但是,如果您打算在复杂的算术中使用 i 和 j 作为变量名称,最好避免使用它们。[...]为了提高速度和鲁棒性,您可以将复数 i 和 j 替换为 1i。
这里已经很好地讨论了与虚数单位的混淆,但还有一些其他更平淡无奇的原因,为什么有时不鼓励使用这些和其他单字母变量名称。
特别是MATLAB:如果您使用编码器从MATLAB代码生成C++源代码(不要,这太可怕了),那么系统会明确警告您不要重用变量,因为潜在的类型冲突。
通常,根据您的 IDE,单字母变量名称可能会对荧光笔和搜索/替换造成严重破坏。MATLAB不会受到这种情况的影响,我相信Visual Studio已经有一段时间没有问题了,但是像MISRA等C/C++编码标准倾向于反对它们。
就我而言,我避免使用所有单字母变量,尽管直接实现数学源具有明显的优势。前几百次你这样做需要一点额外的努力,但在那之后你就不再注意到了,当你或其他一些可怜的灵魂来阅读你的代码时,好处是巨大的。
除非您是一个非常困惑的用户,否则我认为使用变量名称 i 和 j 的风险很小,并且我经常使用它们。我还没有看到任何官方迹象表明应该避免这种做法。
虽然确实,正如其他帖子中提到的,在某些上下文中,隐藏虚构单元可能会造成一些混乱,但总的来说,我根本不认为这是一个主要问题。在MATLAB中,您可以做更多令人困惑的事情,例如定义false=true
在我看来,唯一应该避免它们的情况是,如果您的代码专门处理虚数。
评论
i
i
j
任何重要的代码都包含多个循环,最佳做法建议使用指示其用途和范围的描述性名称。自古以来(除非我不打算保存它的 5-10 行脚本),我一直使用变量名称,如 等。for
idxTask
idxAnotherTask
idxSubTask
或者至少将它所索引的数组的第一个字母加倍,例如 索引 ,索引 ,但不是 ,或者哪个不能帮助我毫不费力地识别它们从我的多个 for 循环中索引的数组。ss
subjectList
tt
taskList
ii
jj
评论
i
j
k