A.范围是编写具有偶数空间元素的行向量的方便方法。范围表达式从范围中第一个元素的值、元素之间增量的可选值以及范围中元素不会超过的最大值定义。基数、增量和限制用冒号分隔(:字符),并且可以包含任何算术表达式和函数调用。如果省略增量,则假定为1。例如,范围
1 : 5
定义一组值[ 1, 2, 3, 4, 5 ],以及范围
1 : 3 : 5
定义一组值[ 1, 4 ].
虽然范围常数指定了行向量,但Octave可以不通常将范围常数转换为向量,除非有必要。这允许您编写一个常量1 : 10000而不需要在典型的起作用站上使用80000字节的存储。
当范围出现在向量内(即方括号内)时,就有必要将范围转换为向量。例如,尽管
x = 0 : 0.1 : 1;
定义x成为类型的变量double_range并占用24字节的内存,表达式
y = [ 0 : 0.1 : 1];
定义y为类型matrix并且占用88字节的存储器。
可以使用函数禁用这种节省空间的优化optimize_range.
请注意,范围的上限(或下限,如果增量为负)并不总是包含在值集中。这在某些情况下是有用的。例如
## 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
如果范围表达式的结果为空,则Octave返回一个空的matrix,而不是一个空的double_range。类似地,如果范围中只有一个元素,则Octave返回一个scalar,而不是一个具有一个元素的double_range.
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2