用于符号和数字输入的书写功能



我正在编写一个(相当大的(纯函数,它将接受数字和符号输入。我面临的问题(主要(是将符号表达式转换为逻辑表达式。例如,当我有一个类似syms x; assume( x, 'positive' );的表达式和一个测试if( x>0 ); ...时,Matlab会抛出一个错误;任一:

Conversion to logical from sym is not possible.

Unable to prove 'x > 0' literally. Use 'isAlways' to test the statement mathematically.

取决于上下文。

到目前为止,我通过将所有的if重写为if( isAlways(x>0) ); ...并在文件夹@double中添加函数isAlways来解决这个问题,这样Matlab在遇到double时就会使用这个函数。

这种方法的缺点是,我还必须为每种其他类型(singleint8、…(编写一个isAlways函数(以及函数simplify、…(

我的另一种方法是,在全局名称空间中编写一个函数isAlways,并在遇到sym时调用内置的isAlways。但是,isAlways似乎不是一个内置的,因为Matlab报告了

>> builtin('isAlways',sym(1));
Error using builtin
Cannot find builtin function 'isAlways' 

你有什么想法可以用一种更优雅的方式,或者至少用另一种方式来解决这个问题吗?


Edit:我不想对函数的代码做太多更改,特别是不想添加像switch class(x)这样的检查;案例sym。。。事例double;…`,但添加";功能性";到Matlab,这样它就可以开箱即用地处理大多数函数。

  1. 在大约R2018的Matlab版本中,我最终在文件夹@double等中定义了一个函数isAlways
  2. 不幸的是,行为在Matlab R2020前后发生了变化。现在,以可靠的方式向类中添加函数已经不可能了。因此,我现在在全局名称空间中定义了一个函数isAlways,它会为每个没有重载的类型调用。这不是一个完美的解决方案,但它至少有效

最新更新