4.2范围

A.范围是编写具有偶数空间元素的行向量的方便方法。范围表达式从范围中第一个元素的值、元素之间增量的可选值以及范围中元素不会超过的最大值定义。基数、增量和限制用冒号分隔(:字符),并且可以包含任何算术表达式和函数调用。如果省略增量,则假定为1。例如,范围

1 : 5

定义一组值[ 1, 2, 3, 4, 5 ],以及范围

1 : 3 : 5

定义一组值[ 1, 4 ].

虽然范围常数指定了行向量,但Octave可以通常将范围常数转换为向量,除非有必要。这允许您编写一个常量1 : 10000而不需要在典型的工作站上使用80000字节的存储。

当范围出现在向量内(即方括号内)时,就有必要将范围转换为向量。例如,尽管

x=0:0.1:1;

定义x成为类型的变量范围并占用24字节的内存,表达式

y=[0:0.1:1];

定义y为类型矩阵并且占用88字节的存储器。

可以使用函数禁用这种节省空间的优化优化范围.

 
: val = optimize_range ()
: old_val = optimize_range (new_val)
: old_val = optimize_range (new_val, "local")

查询或设置存储区域是否使用特殊的节省空间的格式。

默认值为true。如果此参数设置为false,Octave将把范围存储为完整矩阵。

当从具有的函数内部调用时地方的参数,则会在本地更改函数及其调用的任何子程序的设置。退出函数时将恢复原始设置。

详见: 优化对角矩阵, 优化术语矩阵.

请注意,范围的上限(或下限,如果增量为负)并不总是包含在值集中。这在某些情况下是有用的。例如

##x是某个预定义的范围、向量、矩阵或数组(1:2:结束)+=1;#递增所有奇数元素x(2:2:end)-=1;#递减所有偶数元素

无论x有奇数个元素或没有,所以没有必要区别对待这两种情况。

Octave使用浮点运算来计算范围中的值。因此,用浮点值定义范围可能会导致以下陷阱:

a=-2b=(0.3-0.2-0.1)x=a:b

从于浮点舍入,b可能等于也可能不等于零,如果不等于,则可能高于零或低于零,因此为最终范围x可以包括也可以不包括零作为其最终值。类似地:

x=1.80:0.05:1.90y=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.80y=(0:1)*0.05+1.85

使其在平台、编译器和编译器设置之间更加安全和可重复。如果您知道元素的数量,也可以使用linspace函数(详见特别的工具矩阵),将包括范围的端点。你也可以明智地使用圆形的, 地板, (用熟石膏、木板等)装天花板, 修理等,以设置极限和增量,而不会受到浮点舍入的干扰。例如,使用以下方法之一可以使前面的示例更安全、更可重复:

a=-2b=圆形((0.3-0.2-0.1)*1e12)/1e12#圆形到12位sc=楼层(0.3-0.2-0.1)#楼层为整数d=楼层((0.3-0.2-0.1)*1 e12)/12位的1e12#楼层x=a:by=a:cz=a:d

当将标量添加到范围,从中减去标量(或从标量中减去arange)并乘以标量时,Octave将试图避免对范围进行分组,并将结果也保持为范围,如果它可以确定这样做是否安全的话。例如

a=2*(1:1e7)-1;

将返回与相同的结果1:2:2e7-1,但从未形成具有1000万元素的avector。

在冒号表示法中使用零作为增量,作为1:0:1是不允许的,因为在确定范围元素的数量时会发生除以零的情况。然而,零增量(即所有元素相等)的范围是有用的,尤其是在索引中,Octave允许使用内置函数构建它们注意,从于范围必须是一个向量,一个(1,10)返回一个范围,而一个(10,1)没有。

Octave解析范围表达式时,会检查表达式中的元素,以确定它们是否都是常量。如果是,则用单个范围常量替换范围表达式。


版权所有 © 2024 Octave中文网

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