我正在编写一个(相当大的(纯函数,它将接受数字和符号输入。我面临的问题(主要(是将符号表达式转换为逻辑表达式。例如,当我有一个类似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
时就会使用这个函数。
这种方法的缺点是,我还必须为每种其他类型(single
、int8
、…(编写一个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,这样它就可以开箱即用地处理大多数函数。
- 在大约R2018的Matlab版本中,我最终在文件夹
@double
等中定义了一个函数isAlways
- 不幸的是,行为在Matlab R2020前后发生了变化。现在,以可靠的方式向类中添加函数已经不可能了。因此,我现在在全局名称空间中定义了一个函数
isAlways
,它会为每个没有重载的类型调用。这不是一个完美的解决方案,但它至少有效