matlab - 如何在 MATLAB 中创建分段内联函数?

标签 matlab function inline piecewise

我在 MATLAB 中有一个函数,它将另一个函数作为参数。我想以某种方式定义一个可以传入的分段内联函数。这在 MATLAB 中是否可行?

编辑:我想代表的功能是:

f(x) = { 1.0,  0.0 <= x <= 0.5,
         -1.0, 0.5 < x <= 1.0

where 0.0 <= x <= 1.0

最佳答案

您确实定义了一个具有三个断点的分段函数,即在 [0, 0.5, 1] 处。但是,您还没有在中断之外定义函数的值。 (顺便说一句,我在这里使用了术语“断裂”,因为我们实际上是在定义样条的一种简单形式,分段恒定样条。我可能还使用了术语“结”,这是样条世界中的另一个常用词。 )

如果你绝对知道你永远不会在 [0,1] 之外计算函数,那么没有问题。因此,只需在 x = 0.5 处定义一个具有一个断点的分段函数。定义像您这样的分段常数函数的简单方法是使用逻辑运算符。因此,测试 (x > 0.5) 返回一个常数,0 或 1。通过缩放和转换该结果,很容易生成一个满足您要求的函数。

constfun = @(x) (x > 0.5)*2 - 1;

内联函数做类似的事情,但与匿名函数相比,内联函数非常慢。我强烈建议使用匿名表格。作为测试,试试这个:
infun = inline('(x > 0.5)*2 - 1','x');
x = 0:.001:1;

tic,y = constfun(x);toc
Elapsed time is 0.002192 seconds.

tic,y = infun(x);toc
Elapsed time is 0.136311 seconds.

是的,内联函数的执行时间比匿名形式多得多。

我在这里使用的简单分段常数形式的一个问题是当您有更多断点时很难扩展。例如,假设您希望定义一个函数,该函数根据点所在的间隔取三个不同的值?虽然这也可以通过创造性地使用测试来完成,小心地移动和缩放它们,但它可能会变得令人讨厌。例如,如何定义返回的分段函数
-1 when x < 0,
2 when 0 <= x < 1,
1 when 1 <= x

一种解决方案是使用单位 Heaviside功能。所以首先,定义一个基本单位 Heaviside 函数。
H = @(x) (x >= 0);

我们的分段函数现在是从 H(x) 导出的。
P = @(x) -1 + H(x)*3 + H(x-1)*(-1);

看到 P(x) 有三部分。第一项是 x 低于第一个断点时发生的情况。然后我们添加一个在零以上生效的片段。最后,第三部分在 x == 1 以上添加了另一个偏移量。它很容易绘制。
ezplot(P,[-3,3])

从这个开始很容易生成更复杂的样条。我再次将这个构造称为样条曲线。真的,这就是我们可能领先的地方。事实上,这就是这导致的。样条是分段函数,在一系列结点或断点处小心地连接在一起。特别是样条通常具有指定的连续性顺序,因此,例如,三次样条将在中断处进行两次可微 (C2)。还有只是 C1 函数的分段三次函数。我在所有这些中的观点是我已经描述了一个简单的起点来形成任何分段函数。它对于多项式样条非常有效,尽管选择这些函数的系数可能需要一点数学知识。

创建此函数的另一种方法是显式分段多项式。在 MATLAB 中,我们有一个鲜为人知的函数 mkpp。试试这个...
pp = mkpp([0 .5 1],[1;-1]);

如果你有样条工具箱,那么 fnplt 会直接为你绘制它。假设您没有那个 TB,请执行以下操作:
ppfun = @(x) ppval(pp,x);
ezplot(ppfun,[0 1])

回顾 mkpp 调用,它毕竟是相当简单的。第一个参数是曲线中的断点列表(作为 ROW 向量)。第二个参数是 COLUMN 向量,曲线将在这两个定义的中断间隔内采用分段常数值。

几年前我发布了另一个选项,piecewise_eval .它可以从 MATLAB Central 文件交换中下载。这是一个允许用户纯粹将分段函数指定为断点列表以及这些断点之间的功能块的函数。因此,对于在 x = 0.5 处有一个中断的函数,我们会这样做:
fun = @(x) piecewise_eval(x,0.5,{1,-1});

请注意,第三个参数提供了每个段中使用的值,尽管这些部分不必是纯粹的常量函数。如果您希望函数在感兴趣的区间之外返回一个 NaN,这也很容易实现。
fun = @(x) piecewise_eval(x,[0 0.5 1],{NaN,1,-1,NaN});

在所有这些相当长的游览中,我的重点是了解什么是分段函数,以及在 MATLAB 中构建一个分段函数的几种方法。

关于matlab - 如何在 MATLAB 中创建分段内联函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/796072/

相关文章:

matlab - 时区应该如何格式化在Matlab中,当将字符串插入带有时区的postgresql字段时间戳时?

matlab - 根据 x 和 y 信息计算航向角

javascript - JS函数参数外部环境

ios - 惰性/内联在 Swift 中实现协议(protocol)

c++ - 如何强制 g++ 内联函数?

MATLAB 和高质量 EPS 图形

matlab - 这个 MATLAB 循环是否有更优雅的替代品?

javascript - 当特定图像接触到其他图像时不触发音频

r - 如何定义一个函数,它接受括号外的参数,如 names()

parameters - Rust 标准库闭包参数 : run time or compile time?