function - 默认表达式可以引用函数声明中的其他输入吗?
问题描述
在 Modelica中,我想实现一个function
clip
Clip
与 Wolfram 语言类似的调用。也就是说,该函数将获取一个值列表x
并返回一个相同长度的向量y
,其中对于每个组件,我们都有一个分段函数:
y_i := x_i for min ≤ x_i ≤ max, v_min for x_i < min, and v_max for x_i > max
所以我们应该看到以下结果:
clip( {-3,-2,-1,0,1,2,3} , {-2,2} ) // { -2, -2, -1, 0, 1, 2, 2 }
clip( {-3,-2,-1,0,1,2,3} , {-2,2}, {-10,10} ) // { -10, -2, -1, 0, 1, 2, 10 }
clip( {-3,-2,-1,0,1,2,3} ) // { -1, -1, -1, 0, 1, 1, 1 }
我的方法如下:
function clip "Clip values so they do not extend beyond a given interval"
input Real x[:] "List of values to be clipped";
input Real[2] x_range := {-1, 1} "Original range [min,max] given as a list (default = {-1,1})";
input Real[2] extremes := x_range "Extreme values [v_min, v_max] given as a list (default {min,max})";
output Real y[size(x, 1)] "Clipped values";
protected
Integer n := size(x, 1) "Length of the input vector x";
algorithm
for i in 1:n loop
y[i] := if x[i] < x_range[1] then extremes[1] elseif x[i] > x_range[2] then extremes[2] else x[i];
end for;
end clip;
请注意,这里的默认表达式extremes
引用x_range
本身具有默认表达式的输入{-1, 1}
。
不幸的是,我在 Wolfram SystemModeler 12.0 和OpenModelica (OMEdit v.1.13.2)中得到了错误的结果,它甚至无法编译。
我的问题是:
- 根据规范,上述功能是否合法 Modelica 代码?
- 不管(1.)是否有另一种方法可以做到这一点?
解决方案
- 是的,这是合法的。Modelica 规范明确允许输入的默认值取决于其他输入等。
https://specification.modelica.org/master/Ch12.html#positional-or-named-input-arguments-of-functions
默认值可能依赖于其他输入(这些依赖在函数中必须是非循环的)——这些其他输入的值将被替换为默认值(如果该输入的默认值依赖于另一个输入,则可以重复此过程)。输入的默认值可能不依赖于函数中的非输入变量。
- 我没有检查替代方案。
推荐阅读
- javascript - 使用 [MEAN] 向 API 发出 POST 请求时阻止跨域请求
- python - 为什么我没有得到某些值的输出
- javascript - want custom title image description in facebook share link in asp.net MVC
- swagger - “=”在 Swagger 路径参数中是什么意思?
- python - 如何阻止正则表达式从 4 个数字中过滤掉 2 个数字?
- excel - Excel VBA:通过 IE 自动化使用 iFrame
- mongodb - TmongoDbInput 模式未正确检索 JsonArray
- java - IntelliJ 突出显示拆分打包错误,但surefire 成功运行测试
- c - 如何从其他用户的桌面程序获取 dbus 消息
- go - 如何在 go 中添加时区以秒为单位获取时间