10.5 The for Statement

for 语句可以更方便地计算循环的迭代次数。for 语句的一般形式如下:

for var = expression
  body
endfor

其中 body 代表任意语句或语句列表,expression 是任何有效表达式,而 var 可以有多种形式。通常它是一个简单的变量名或索引变量。如果 expression 的值是一个结构体,var 也可以是一个包含两个元素的向量。请参见下面的遍历结构体元素

for 语句中的赋值表达式与 Octave 的普通赋值语句略有不同。它不会将表达式的完整结果赋值给变量,而是依次将表达式的每一列赋值给 var。如果 expression 是一个范围、行向量或标量,则每次执行循环体时 var 的值将是一个标量。如果 expression 是一个列向量或矩阵,则每次执行循环体时 var 将是一个列向量。

以下示例展示了创建包含斐波那契数列前十个元素的向量的另一种方法,这次使用 for 语句:

fib = ones (1, 10);
for i = 3:10
  fib(i) = fib(i-1) + fib(i-2);
endfor

这段代码首先计算表达式 3:10,生成一个从 3 到 10(包含两端)的值范围。然后变量 i 被赋值为该范围的第一个元素,并执行一次循环体。当到达循环体末尾时,范围内的下一个值被赋给变量 i,循环体再次执行。这个过程持续进行,直到没有更多元素需要赋值为止。

在 Octave 中,还可以使用 for 语句遍历矩阵或元胞数组。例如:

disp ("Loop over a matrix")
for i = [1,3;2,4]
  i
endfor
disp ("Loop over a cell array")
for i = {1,"two";"three",4}
  i
endfor

在这种情况下,变量 i 取矩阵或元胞矩阵的每一列的值。因此第一个循环迭代两次,依次生成两个列向量 [1;2][3;4],元胞数组上的循环同理。这可以扩展到多维数组的循环。例如:

a = [1,3;2,4]; c = cat (3, a, 2*a);
for i = c
  i
endfor

在上述情况下,多维矩阵 c 被重塑为二维矩阵,即 reshape (c, rows (c), prod (size (c)(2:end))),然后产生与遍历二维矩阵相同的行为。

尽管可以将所有 for 循环重写为 while 循环,但 Octave 语言同时提供了这两种语句,因为 for 循环通常既更少打字,也更符合思维习惯。在循环中计算迭代次数非常常见,将这种计数视为循环的一部分比在循环内部手动处理更加直观。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2