A.范围是编写具有偶数空间元素的行向量的方便方法。范围表达式从范围中第一个元素的值、元素之间增量的可选值以及范围中元素不会超过的最大值定义。基数、增量和限制用冒号分隔(:字符),并且可以包含任何算术表达式和函数调用。如果省略增量,则假定为1。例如,范围
1 : 5
定义一组值[ 1, 2, 3, 4, 5 ]
,以及范围
1 : 3 : 5
定义一组值[ 1, 4 ]
.
虽然范围常数指定了行向量,但Octave可以不通常将范围常数转换为向量,除非有必要。这允许您编写一个常量1 : 10000
而不需要在典型的工作站上使用80000字节的存储。
当范围出现在向量内(即方括号内)时,就有必要将范围转换为向量。例如,尽管
x = 0 : 0.1 : 1;
定义x成为类型的变量range
并占用24字节的内存,表达式
y = [ 0 : 0.1 : 1];
定义y为类型matrix
并且占用88字节的存储器。
可以使用函数禁用这种节省空间的优化优化范围.
请注意,范围的上限(或下限,如果增量为负)并不总是包含在值集中。这在某些情况下是有用的。例如
## x is some predefined range or vector or matrix or array x(1:2:end) += 1; # increment all odd-numbered elements x(2:2:end) -= 1; # decrement all even-numbered elements
无论x有奇数个元素或没有,所以没有必要区别对待这两种情况。
Octave使用浮点运算来计算范围中的值。因此,用浮点值定义范围可能会导致以下陷阱:
a = -2 b = (0.3 - 0.2 - 0.1) x = a : b
从于浮点舍入,b可能等于也可能不等于零,如果不等于,则可能高于零或低于零,因此为最终范围x可以包括也可以不包括零作为其最终值。类似地:
x = 1.80 : 0.05 : 1.90 y = 1.85 : 0.05 : 1.90
并不像看上去那么可预测。截至Octave8.3,获得的结果如下x具有三个元素(1.80、1.85和1.90),以及y只有一个元素(1.85但不是1.90)。因此,当在范围中使用浮点时,即使在上述示例中没有触摸到结束值,改变范围的开始也很容易影响范围的结束。
为了避免浮动点在范围内的这种陷阱,您应该使用以下模式之一。对以前代码的此更改:
x = (0:2) * 0.05 + 1.80 y = (0:1) * 0.05 + 1.85
使其在平台、编译器和编译器设置之间更加安全和可重复。如果您知道元素的数量,也可以使用linspace
函数(详见特别的工具矩阵),将包括范围的端点。你也可以明智地使用round
, floor
, ceil
, fix
等,以设置极限和增量,而不会受到浮点舍入的干扰。例如,使用以下方法之一可以使前面的示例更安全、更可重复:
a = -2 b = round ((0.3 - 0.2 - 0.1) * 1e12) / 1e12 # rounds to 12 digits c = floor (0.3 - 0.2 - 0.1) # floors as integer d = floor ((0.3 - 0.2 - 0.1) * 1e12) / 1e12 # floors at 12 digits x = a : b y = a : c z = a : d
当将标量添加到范围,从中减去标量(或从标量中减去arange)并乘以标量时,Octave将试图避免对范围进行分组,并将结果也保持为范围,如果它可以确定这样做是否安全的话。例如
a = 2*(1:1e7) - 1;
将返回与相同的结果1:2:2e7-1
,但从未形成具有1000万元素的avector。
在冒号表示法中使用零作为增量,作为1:0:1
是不允许的,因为在确定范围元素的数量时会发生除以零的情况。然而,零增量(即所有元素相等)的范围是有用的,尤其是在索引中,Octave允许使用内置函数构建它们ones
注意,从于范围必须是一个向量,ones (1, 10)
返回一个范围,而ones (10, 1)
没有。
Octave解析范围表达式时,会检查表达式中的元素,以确定它们是否都是常量。如果是,则用单个范围常量替换范围表达式。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2