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

2023-11-27

我在 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函数。

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 将直接为您绘制此图。假设您没有结核病,请执行以下操作:

ppfun = @(x) ppval(pp,x);
ezplot(ppfun,[0 1])

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

几年前我发布了另一个选项,分段评估。它可以从 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 中构建分段函数的几种方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MATLAB 中创建分段内联函数? 的相关文章

  • Javascript 中“是……的实例”是什么意思?

    这个问题的答案 JavaScript 函数的原型属性的初始值是多少 https stackoverflow com questions 4073677 what is the initial value of a javascript fu
  • 如何使用 jQuery 在第二次单击时反转 CSS 动画

    我制作了以下菜单图标 CSS 动画 当我点击它时会触发它 当我使用 jQuery 第二次单击它时 我想使其反向动画 path1 stroke dasharray 33px stroke dashoffset 33px animation l
  • Excel - 查找列中不是错误或空白的最后一个值

    我需要在 Excel 电子表格的一列中找到最后一个非错误 非空白值 该列可以有多个 N A 实例 它们与实际值交替 有多种解决方案可用于查找最后一个非空单元格 但这些解决方案不考虑错误 特别是如果最后一个非空单元格出现错误 在这种情况下 解
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • 如何确定函数是否不返回任何内容?

    有没有办法在 PHP 中使用反射或其他方法来做到这一点 function a return null function b a a null b b null 如果您没有显式返回某些内容 则函数将返回null默认情况下 这就是 PHP 中函
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • 有没有办法从画布上清除一个元素而不消除其他元素?

    我正在使用画布构建页面加载器 并使用 es6 类 虽然目前我无法使其正常工作 原因之一是我找不到清除画布的方法进展 到目前为止 这是我的代码 class Loader constructor width height this width
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后
  • Matlab 图像数据的 hist 函数

    我是 Matlab 新手 我想制作自己的函数 与 imhist 显示图像数据的直方图 完成相同的工作 但我对此完全是新手 我不知道如何做开发这样的功能 我开始做一些东西 但它非常不完整 function output args myhist
  • for 循环中的绘图没有可见点

    我正在努力解决我想使用 for 循环制作的情节 我知道当我在循环之后添加它时它会起作用 只是一个简单的图 但我想用另一种方式尝试一下 fib ones 1 10 for k 3 10 hold on fib k fib k 1 fib k
  • Emacs Lisp 可以将 lambda 形式分配给像Scheme 这样的变量吗?

    在研究 Emacs Lisp 的符号单元时 我发现像这样的示例函数 defun a rest x x 我可以打电话 symbol function a 返回 lambda rest x x 如果我愿意的话我可以使用它 gt lambda r
  • Matlab:条形图中缺少标签

    使用 Matlab 2012 和 2013 我发现设置XTickLabel on a bar图表最多只能使用 15 个柱 如果条形较多 则标签会丢失 如下所示 绘制 15 个条形图 N 15 x 1 N labels num2str x d
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un
  • 在matlab中,如何读取python pickle文件?

    在 python 中 我生成了一个 p 数据文件 pickle dump allData open myallData p wb 现在我想在Matlab中读取myallData p 我的Matlab安装在Windows 8下 其中没有Pyt
  • Matlab的导入函数的范围是什么?

    我正在尝试将一些用 Matlab 编写的代码转换为独立的 编译的 Matlab 应用程序 然而 在出现一些奇怪的错误之后 我意识到代码大量使用了从路径中添加和删除的操作 以避免多次使用多个具有相同名称 但结果 计算不同 的函数这一事实 环顾
  • 如何创建不返回任何内容的函数

    我想写一个函数pl pgsql 我在用着Postgres 企业管理器 v3并使用 shell 来创建一个函数 但在 shell 中我必须定义返回类型 如果我不定义返回类型 我将无法创建函数 如何创建一个不返回结果的函数 即创建一个新表的函数
  • matlab中无限while嵌套在for循环中

    我想做一个while循环 嵌套在for在 Matlab 中循环以查找数据中不同对之间的距离 我的数据具有以下形式 ID lon lat time 1 33 56 40 89 803 2 32 45 41 03 803 3 35 78 39
  • Haskell - lambda 表达式

    我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式 我不太明白使用 lambda 表达式相对于定义函数的约定方式有何优势 例如 我通常会执行以下操作 let add x y x y 我可以简单地打电话 add

随机推荐