使用matlabengine从Python调用MATLAB scatteredInterpolant对象报错求助
解决Python调用MATLAB scatteredInterpolant对象的问题
你之前的两种调用方式都踩了matlabengine的坑,原因和解决方法如下:
错误原因分析
- 第一种
eng.b():eng代表MATLAB工作区,你在Python里定义的b是本地的matlab.object,MATLAB工作区里根本没有叫b的变量,所以报错"Undefined function 'b'"。 - 第二种直接
b():Python里的matlab.object不能像MATLAB函数那样直接调用,必须通过MATLAB引擎来触发它的方法。
两种可行的解决方法
方法一:把对象传入MATLAB工作区再调用
先把Python中的b同步到MATLAB工作区,再用MATLAB的语法调用插值:
import matlab.engine eng = matlab.engine.start_matlab() a = matlab.double([[1,2],[4,5]]) # 创建scatteredInterpolant对象 b = eng.scatteredInterpolant(a, matlab.double([[1],[2]]), 'linear') # 将对象传入MATLAB工作区 eng.workspace['interp_obj'] = b # 在MATLAB环境中执行插值调用 c = eng.eval('interp_obj([1,2])') print(c)
方法二:用eng.feval直接调用对象的求值逻辑
scatteredInterpolant的调用本质是调用它的求值逻辑,直接用feval把对象作为第一个参数传入即可:
import matlab.engine eng = matlab.engine.start_matlab() a = matlab.double([[1,2],[4,5]]) b = eng.scatteredInterpolant(a, matlab.double([[1],[2]]), 'linear') # 用feval调用对象,传入插值点(注意要传二维数组匹配MATLAB格式) c = eng.feval(b, matlab.double([[1,2]])) print(c)
注意事项
- 传入MATLAB的数组格式要匹配:比如插值点
[1,2]要包装成matlab.double([[1,2]])(二维行向量),符合MATLAB的输入要求。 - 批量插值时,直接扩展二维数组的行即可,比如
matlab.double([[1,2],[3,4]])。
内容的提问来源于stack exchange,提问作者requiemman
相关产品推荐
相关产品推荐

