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

Sha*_*hai 138 variables matlab naming-conventions

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

例如,在循环中:

for i=1:10,
    % do something...
end
Run Code Online (Sandbox Code Playgroud)

作为矩阵的索引:

mat( i, j ) = 4;
Run Code Online (Sandbox Code Playgroud)

为什么不应该他们作为在Matlab的变量名?

Oli*_*rth 175

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

所以变量调用ij将覆盖它们,可能会默默地破坏执行复杂数学的代码.

可能的解决方案包括使用iijj作为循环变量,或者使用1i何时i需要表示虚构单元.

  • 值得注意的是,即使你没有破坏任何东西,仍然牺牲​​了执行时间来解决`i`和`j`变量名. (41认同)
  • @Eitan:你真的可以在JIT编译版的Matlab中以任何具体的结论方式支持吗?我从来没有发现它是这种情况(简单的测试称为'for`循环10亿次显示时间上没有统计差异).我们知道有一些特殊的代码来处理这个问题,使用除`i`和`j`(以及`k`?)之外的变量实际上稍慢一些.存在的差异在现实生活中是微不足道的.根本没有理由不使用`i`和`j`作为常规变量 - 它们必须像任何其他Matlab函数一样正确使用. (14认同)
  • 在古代版本的Matlab中也许.我曾经看到过自己.但至少不再使用R2012a +(OS X)了.当我看到`for`循环10亿次并尝试各种计时方案时,我没有看到任何区别.我看到新的SO用户被告知完全有效的代码是错误的,因为他们使用`i`和`j`来迭代循环.坦率地说,它只是愚蠢而且人们错过了这个问题的更重要的一点:如果想要编写可读的现代Matlab代码,那么`i`和`j`甚至不应该用于想象单元. (14认同)
  • 我节省的主要时间是搜索ii时.寻找我可能是一个真正的痛苦 (12认同)
  • @horchler好吧,官方文档声明[在这里](http://goo.gl/risIl),重写标准MATLAB数据类"会对性能产生负面影响",[这里](http://goo.gl/bzQ9a)由于速度和稳健性的原因,它意味着避免重写复杂的常量.在[R2009b的旧文档](http://goo.gl/PVwFk)中,明确建议不要覆盖复杂常量,因为这可能会妨碍JIT加速.变量名称解析可能是微不足道的,但如果重复数百万次,它可能会很重要. (5认同)
  • @horchler我在很大程度上同意,但R2013文档也证实了MATLAB并不总能正确地加速变量名称解析.无论如何,早在R2009发布的版本仍然很普遍,所以我建议在编写代码时考虑到这一点.也许正确的措辞应该是"......执行时间_may_仍然可以牺牲......" (3认同)

sho*_*zer 62

最好避免ij变量,以防止混淆它们是变量或虚构单位.

然而,就个人而言,我经常使用ij作为变量作为短循环的索引.为了避免我自己的代码中的问题,我遵循另一个关于i和的好习惯j:不要用它们来表示虚数.实际上,Matlab自己的文档说明:

对于速度和改进的鲁棒性,可以取代复杂的ij通过1i.

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

  • 使用`1i`确实是一种好习惯.但是,更改"i"和"j"的含义可能会导致难以调试的错误,例如[this](http://www.stackoverflow.com/questions/13860222/what-is-complex-scalar型-无效-作为指数值). (2认同)
  • 请注意,提到的速度似乎并不是非常重要:http://stackoverflow.com/questions/18163454/mo​​re-on-using-i-and-j-as-variables-in-matlab-speed (2认同)

Sam*_*rts 27

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

因此,您的代码将变慢刚才的非常存在ij作为变量,如果你改变他们到别的东西将加快.这就是为什么,如果你阅读了很多MathWorks代码,你会看到iijj使用相当广泛的循环索引.有一段时间,MathWorks甚至可能会非正式地建议人们自己这样做(尽管他们总是正式建议人们为优雅/可维护性而不是当前JIT所做的任何事情,因为它是每个版本的移动目标).

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

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

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


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

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


Den*_*din 15

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

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

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

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

val2 = val + i  % 1
val2 = val + ii % 2
val2 = val + 1i % 3
Run Code Online (Sandbox Code Playgroud)

一个人不会轻易被误读为两个或三个,但是两个和三个相似.

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

单个字母索引,对于如果不使用许多循环变量和字母的例子就足够了:t,u,kp

更长的指数例如:i_loop,step,walk,和t_now

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

  • @DennisJaheruddin:无耻的插件:使用我的MATLAB语法突出显示[userscript](https://github.com/amroamroamro/prettify-matlab/raw/master/js/prettify-matlab.user.js)进行Stack Overflow.在最后一个例子中,`1i`的颜色与数字不同:) (2认同)
  • 直接来自`doc i`和`doc j`:"为了提高速度和提高稳健性,你可以用1i代替复杂的i和j." IMO,在当前的Matlab中,没有理由不在循环等中使用`i`和`j`,或者使用除了'1i`以外的任何东西来表示虚构单元(`1j`也可以).唯一的例外是将字符串传递给始终稍微不兼容的符号引擎.奇怪的是,"帮助1i"和"doc 1i"虽然不起作用. (2认同)

Flo*_*ris 11

有人指出,这1i是一种可接受且毫不含糊的写作方式sqrt(-1),因此没有必要避免使用i.话又说回来,丹尼斯指出(/sf/answers/1042561061/),它可以是很难看到的区别1iii.我的建议:1j在可能的情况下用作虚数常数.这是同样的把戏,电气工程师使用-他们使用jsqrt(-1),因为i已经采取电流.

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

  • "很难看出`1i`和`ii`之间的区别"以及`1`和`l`之间以及`O`和'0'之间的区别.这就是为什么我在新的MATALB安装中所做的第一步是更改默认字体大小. (2认同)

xen*_*ast 6

与虚构单位的混淆在这里得到了很好的解释,但是为什么有时候不鼓励使用这些和其他单字母变量名称还有其他一些更平常的原因.

  1. 具体来说MATLAB:如果你使用编码器从你的MATLAB代码生成C++源代码(不要,那太可怕了)那么你明确警告不要因为潜在的类型冲突而重用变量.

  2. 通常,根据您的IDE,单字母变量名称可能会导致高亮显示和搜索/替换.MATLAB并没有受此影响,我相信Visual Studio在一段时间内没有出现问题,但像MISRA等C/C++编码标准倾向于建议它们.

尽管直接实现数学源有明显的优势,但就我而言,我避免使用所有单字母变量.前几百次你需要花费一点额外的努力,但之后你就会停止注意,当你或其他一些不好的灵魂来阅读你的代码时,你的优势就是军团.