在Matlab中使用i和j作为变量

时间:2013-02-09 19:37:23

标签: matlab variables naming-conventions

ij是非常受欢迎的变量名称(例如,请参阅this questionthis one)。

例如,在循环中:

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

作为矩阵的索引:

mat( i, j ) = 4;

为什么不应该在Matlab中用作变量名?

8 个答案:

答案 0 :(得分:174)

因为ij都是表示imaginary unit的函数:

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

可能的解决方案包括使用iijj作为循环变量,或者只要需要1i来表示虚数单位,就使用i

答案 1 :(得分:62)

优良作法是避免ij变量,以防止混淆变量或虚构单位。

然而,就个人而言,我经常使用ij作为变量作为短循环的索引。为了避免我自己的代码出现问题,我遵循了另一个关于ij的良好做法:不要使用它们来表示虚数。事实上,Matlab's own documentation states

  

为了提高速度和改进的稳健性,您可以用i替换复杂的j1i

因此,由于潜在的冲突,我不是避免使用两个非常常用的变量名,而是明确假想的数字。它还使我的代码更清晰。每当我看到1i时,我都知道它代表sqrt(-1),因为它不可能是变量。

答案 2 :(得分:27)

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

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

但那是很久以前的事了,而现在它有点像一个“僵尸”问题,实际上并不像许多人想象的那么重要,但拒绝死亡。

在任何最新版本中,无论是否使用ij作为变量名称,都是个人偏好。如果您使用复杂数字进行大量工作,您可能希望避免ij作为变量,以避免任何混淆的潜在风险(尽管您也可能/只想使用{ {1}}或1i更少混淆,性能更好一点。)

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


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

  

由于我是一个函数,它可以被重写并用作变量。但是,如果您打算在复杂算术中使用它们,最好避免使用i和j作为变量名。 [...]为了提高速度和改进稳健性,您可以将复杂的i和j替换为1i。

答案 3 :(得分:15)

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

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

根据建议:建议使用1iii。然而,尽管这些都与i有很好的偏差,但将这两种替代方案结合使用并不是很好。

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

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

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

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

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

较长指数的示例:i_loopstepwalkt_now

当然这也是个人品味的问题,但要找到一个具有明确含义且不会长时间使用的指数应该不难。

答案 4 :(得分:11)

有人指出1i是一种可以接受且明确的方式来编写sqrt(-1),因此没有必要避免使用i。然后,正如丹尼斯指出的那样(https://stackoverflow.com/a/14893729/1967396),很难看出1iii之间的区别。我的建议:尽可能使用1j作为虚数常量。这与电气工程师采用的技巧相同 - 他们对j使用sqrt(-1),因为current已采用i

我个人从不使用ij;当我需要使用复数时,我使用iijj作为简写索引变量(和kk,ll,mm,...)和1j

答案 5 :(得分:3)

任何非平凡的代码都包含多个for循环,最佳做法建议您使用指示其目的和范围的描述性名称。远古时代(除非它的5-10行脚本我不打算保存),我一直在使用idxTaskidxAnotherTaskidxSubTask等变量名称。

或者至少加倍数组的第一个字母,它正在索引,例如ss索引subjectListtt索引taskList,但iijj不能帮助我毫不费力地确定哪个阵列正在索引我的多个for循环。

答案 6 :(得分:2)

默认情况下,ij代表虚构单位。因此,从MATLAB的角度来看,使用i作为变量就像使用1作为变量一样。

答案 7 :(得分:0)

因为默认情况下,i和j是虚数单位。 如果给i和j分配其他值,则默认值将被覆盖。这可能会引起混乱。 但是,避免这种情况的一种好方法是使用1i和1j作为虚数单位。通常,您可以使用ni和nj表示虚数。

例如:

>> i

ans =

   0.0000 + 1.0000i

>> i=2

i =

     2

>> 1i

ans =

   0.0000 + 1.0000i