首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python生成MATLAB代码

从python生成MATLAB代码
EN

Stack Overflow用户
提问于 2016-09-18 10:24:05
回答 1查看 308关注 0票数 3

我在使用MATLAB python引擎时遇到了问题。

我希望从Python中获得ODEs的近似解(使用类似于MATLAB中的ode45函数),但问题是,ODE近似需要一个我似乎无法从MATLAB创建的ODE函数规范。

它可以很好地从Python调用MATLAB函数,比如isprime,但是似乎没有办法在Python中指定MATLAB函数。

因此,我的问题是:是否有任何方法从Python生成MATLAB函数代码,还是从Python中指定MATLAB函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-18 15:39:40

,根据docs,必须是一个函数句柄。

解ODE y‘= 2t 使用0,5的时间间隔,初始条件y0 = 0。

代码语言:javascript
复制
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数据类型不受MATLAB引擎API for Python:的支持

  • 范畴数组
  • char阵列(M-by-N)
  • 单元阵列(M N)
  • 函数处理
  • 稀疏阵列
  • 结构阵列
  • 表格
  • MATLAB值对象(关于句柄和值类的讨论,请参见句柄类和值类的比较)
  • 非MATLAB对象(例如Java对象)

总之,似乎没有直接的方法可以做到这一点。

潜在的解决方法可能涉及engine.workspaceengine.eval的某些组合,如在Python中使用MATLAB引擎工作区示例所示。

使用engine.eval (第一次演示)解决方案:

代码语言:javascript
复制
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在那里计算它。返回的是纯数字数组。在此之后,您可以对结果向量进行操作,例如绘制它们。

由于以文字形式传递参数很快就会变得痛苦,所以可以使用engine.workspace来避免:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39556602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档