从python生成MATLAB代码

时间:2016-09-18 10:24:06

标签: python matlab python-3.x

使用MATLAB python engine时出现问题。

我想从Python获得ODE的近似解决方案(使用类似MATLAB中的ode45函数),但问题是ODE近似需要ODE函数规范,我似乎无法从中创建MATLAB Python引擎。

从Python调用MATLAB函数(例如isprime)可以正常工作,但似乎无法在Python中指定MATLAB函数。

因此我的问题是; 有没有办法从Python生成MATLAB函数代码,还是从Python中指定MATLAB函数的方法?

1 个答案:

答案 0 :(得分:1)

odefun passed to ode45, according to docs, has to be a function handle

  

解决ODE

     

y'= 2t

     

使用[0,5]的时间间隔和初始条件y0 = 0.

tspan = [0 5];
y0 = 0;
[t,y] = ode45(@(t,y) 2*t, tspan, y0);

@(t,y) 2*t返回匿名函数的函数句柄。

不幸的是,function handles are listed as one of datatypes unsupported in MATLAB <-> Python conversion

  

不支持的MATLAB类型MATLAB Engine API for Python不支持以下MATLAB数据类型:

     
      
  • 分类数组
  •   
  • char array(M-by-N)
  •   
  • 细胞阵列(M-by-N)
  •   
  • 功能句柄
  •   
  • 稀疏数组
  •   
  • 结构数组
  •   
  •   
  • MATLAB值对象(有关句柄和值类的讨论,请参阅句柄和值类的比较)
  •   
  • 非MATLAB对象(例如Java®对象)
  •   

总而言之,似乎没有直接的方法。

潜在的解决方法可能涉及engine.workspaceengine.eval的某种组合,如Use MATLAB Engine Workspace in Python示例所示。

engine.evalfirst demo)的解决方法:

import matlab.engine
import matplotlib.pyplot as plt

e = matlab.engine.start_matlab()
tr, yr = e.eval('ode45(@(t,y) 2*t, [0 5], 0)', nargout=2)
plt.plot(tr, yr)
plt.show()

通过这样做,您可以避免通过MATLAB / Python屏障传递函数句柄。您传递字符串(字节)并允许MATLAB在那里评估它。返回的是纯数字数组。之后,您可以对结果向量进行操作,例如绘制它们。

Matplotlib result

由于将参数作为文字传递很快就会变得很痛苦,engine.workspace可能会被用来避免它:

import matlab.engine
import matplotlib.pyplot as plt

e = matlab.engine.start_matlab()
e.workspace['tspan'] = matlab.double([0.0, 5.0])
e.workspace['y0'] = 0.0
tr, yr = e.eval('ode45(@(t,y) 2*t, tspan, y0)', nargout=2)
plt.plot(tr, yr)
plt.show()