B.2演示函数

 
: demo name
: demo name n
: demo ("name")
: demo ("name", n)

运行示例代码块n与函数关联name.

如果n未指定,则运行所有示例。

例如,代码块的首选位置嵌入在脚本文件中,紧挨着它执行的代码。或者,示例可以存储在Octave的加载路径上具有相同名称但没有扩展名的文件中。要将示例与常规脚本代码分开,所有行都以%!.每个例子也必须从关键字介绍演示用nointervening空格向左对齐前缀。该示例的其余部分可以包含arbitryOctave代码。例如

%!演示%!t=0:0.01:2*pi;%!x=sin(t);%!绘图(t,x);%!title(“正弦波的一个周期”);%!#------------------------------------------------------%!#图形窗口显示正弦波的一个周期

请注意,代码是在执行之前显示的,因此末尾的简单注释足以符号所显示的内容。对于绘图,也可以使用进行符号标题文本。一般来说必须使用disp输出函数在演示中。

演示在独立的函数环境中运行,不能访问外部变量。这意味着每个演示都必须有单独的初始化代码。或者,可以将所有演示与代码组合成一个大型演示

%! input(“按<enter>继续:”,“s”);

在节之间,但不鼓励使用这种用法。作废多个初始化块的其他技术包括使用具有新的图形每个绘图之间的命令,或使用子地块在同一窗口中放置多个绘图。

最后,因为演示在函数上下文中求值-不可能在代码中定义新函数。在大多数情况下,匿名函数是一个很好的替代品。如果函数块必须然后使用代码eval(示例(“函数”,n))会让奥克塔韦托看到他们。然而,这也有其自身的问题,因为eval一次只计算一行或一条语句。在这种情况下,函数语句必须用软件包如果1<demo-stuff>endif这里的如果与在同一条线上演示例如

%!演示如果1%!函数y=f(x)%!y=x;%!endfunction%!f(3)%!endif

详见: rundemos, 实例, 测验.

 
: example name
: example name n
: example ("name")
: example ("name", n)
: [codestr, codeidx] = example (…)

例如显示代码n与函数关联name,但不要运行它。

如果n未指定,则显示所有示例。

当使用输出参数调用时,示例以字符串的形式返回代码str具有codeidx指示了各种示例的结束位置。

有关完整解释,详见演示.

详见: 演示, 测验.

 
: oruntests ()
: oruntests (directory)

对指定的中的所有m文件执行内置测试目录.

任何C++源文件中的测试块(*.cc)也将执行以与动态链接的oct文件函数一起使用。

如果没有指定目录,请对Octave的函数搜索路径中的所有目录进行操作。

详见: rundemos, 测验, 路径.

 
: rundemos ()
: rundemos (directory)

为指定的中的所有m文件执行内置演示目录.

任何C++源文件中的演示块(*.cc)也将执行以与动态链接的oct文件函数一起使用。

如果没有指定目录,请对Octave的函数搜索路径中的所有目录进行操作。

详见: 演示, oruntests, 路径.

 
: speed (f, init, max_n, f2, tol)
: [order, n, T_f, T_f2] = speed (…)

确定表达式的执行时间(f)对于各种输入值(n).

这个n对数间距为1到最大_n.对于每个n,初始化表达式(初始化)计算以创建测试所需的任何数据。如果第二个表达式(f2)然后比较了这两个表达式的执行次数。当在没有输出参数的情况下调用时,结果将打印到stdout并以图形方式显示。

f

要计算的代码表达式。

最大_n

要运行的最大测试长度。默认值为100。或者,使用[最小值,最大值]或指定n完全与[n1,n2,…,nk].

初始化

函数参数值的初始化表达式。使用k测试编号和n测试的大小。这应该计算使用的所有变量的值f。请注意初始化将首先评估k=0,所以在整个测试序列中不变的东西可以计算一次。默认值为x=随机(n1..

f2

一个可供选择的表达式进行评估,以便可以直接比较两个表达式的速度。默认为[].

tol

用于比较表达式结果的容差f和表达式f2如果tol是积极的,公差度是绝对的。如果tol是负的,公差是相对的。默认为eps如果tolInf,则不进行比较。

顺序

表达式的时间复杂性O(a*n^p)。这是一个带有字段的结构体a</p>.

n

n为其计算表达式以及执行时间大于零。

T_f

为表达式记录的非零执行时间f以秒为单位。

T_f2

为表达式记录的非零执行时间f2以秒为单位。如果需要,平均时间比简单地为平均值(T_f/T_f2).

执行时间图的斜率显示了症状运行时间的近似幂O(n ^p)该幂是为其近似的区域(图的后半部分)绘制的。估计的功率不是很准确,但应该足以确定算法的一般顺序。它应该表明,例如,实施是否出乎意料O(n^2)而不是O(n)因为它每次通过循环扩展一个向量,而不是预先赋值存储。在当前版本的Octave中,以下内容不是预期的O(n).

速度(“对于i=1:n,y{i}=x(i);endfor”,“”,[100010000])

但是如果你预先赋值了元胞数组y:

速度(“对于i=1:n,y{i}=x(i);endfor”。。。“x=兰特(n,1);y=数组(大小(x));”,[100010000])

人们试图估算单个操作的成本,但这是极不准确的。你可以通过为每个人做更多的工作来提高稳定性n例如

速度(“airy(x)”,“x=rand(n,10)”,[100000])

比较两个不同的表达式时(f, f2),如果新表达式更快,则加速比图上直线的斜率应大于1。更好的算法斜率很小。通常,对算法进行向量化不会改变执行时间图的斜率,但会使其相对于原始时间图发生偏移。例如

速度(“sum(x)”,“”,[100000]。。。“v=0;对于i=1:长度(x),v+=x(i);endfor”)

下面是一个更复杂的例子。如果有的原始版本互相关系数使用for循环和使用FFT的第二个版本,则可以如下比较各种滞后的运行速度,或者如下比较具有不同向量长度的固定滞后的运行速率:

速度(“xcorr(x,n)”,“x=兰特(128,1);”,100,“xcorr_orig(x,n)”,-100*eps)

假设两个版本中的一个在xcorr_orig中,这将比较它们的速度和输出值。请注意,FFT版本并不准确,因此必须在比较中指定可接受的公差100*eps在这种情况下,应该相对地计算比较,如abs((x- y) ./ y)而不是绝对地abs(x- y).

类型示例(“速度”)看看一些真实的例子或者演示(“速度”)来运行它们。


版权所有 © 2024 Octave中文网

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