for循环范围语法

时间:2013-11-13 17:29:58

标签: matlab octave

我花了几个小时调试一个我认为会出现语法错误的问题。

a = zeros(3);
for i=1:1size(a,2) % note the missing colon between 1 and size(a,2)
    i
end

以下仅显示

ans = 3
1

基本上,似乎Matlab / Octave将上述内容解析为:

for i=1:1
    size(a,2)
    i
end

但请注意

i=1:1size(a,2)

产生语法错误。有没有一个很好的理由Matlab / Octave有这个for循环语法?是否有一些它应该变得更容易?只是好奇是否有人对此有任何想法。感谢。

2 个答案:

答案 0 :(得分:4)

Matlab的语法允许这一点确实有点令人惊讶。我不知道为什么这是允许的。一个原因可能是在一行上允许for循环:

>> for i=1:3 disp(i);end
     1
     2
     3

但有趣的是,不允许删除空格:

>> for i=1:3disp(i);end
 for i=1:3disp(i);end
        |
Error: Unexpected MATLAB operator.

这个原因可能是d之后的数字是编写浮点数(3d10 == 3e10)的另一种方式,所以解析器/标记器最初认为你定义了一个数字,但是看到i时会感到困惑。 Daniel的fprintf示例确实有效,因为后跟f的数字不是有效数字,因此tokenizer会理解您启动了一个新令牌。

我想多年前(> 30?),当他们定义matlab的语法时,他们没有预见到这会引入这种难以发现的问题。我猜matlab最初是由工程师为工程师编写的,而不是由知道如何设计通用编程语言的人编写的。其他语言(如C或Python)使用标点符号将循环条件与循环体分开,因此没有歧义。我不知道是否仍然可以纠正Matlab的语法,因为它可能会破坏依赖于当前行为的旧代码。

至少,如果您使用最新版本的Matlab,则代码中的编辑器warns for various problems。注意右边框中的小红色破折号可以为你节省几个小时的调试时间(但也许你正在使用八度音阶)。我试图养成一个习惯来修复它所表示的所有警告。对于您的代码,它显示以下内容:

editor Screenshot

答案 1 :(得分:1)

您的代码等同于

a = zeros(3);
for i=1:1
    size(a,2)
    i
end

在某些地方,每个人都会使用换行符或空格,但解析器本身并不需要。

最小循环:

for i=1:3fprintf('%d',i),end

但我建议至少使用逗号分隔版本,其他一切都很难读:

for i=1:3,fprintf('%d',i),end