您的位置:首页 > 编程语言 > MATLAB

【转载】在Matlab中使用IronPython(一)——初步试验

2017-12-05 21:19 323 查看
原文地址:http://blog.sina.com.cn/s/blog_4513dde60101deda.html

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。

作者:xialulee

最初发布于:2011年12月20日,http://blog.sina.com.cn/xialulee

    以前尝试使用msscript.ocx在Matlab调用CPython,见《用msscript.ocx连接Matlab与ActiveX Script(一)——初步试验》。当时我想,因为Matlab中可以直接使用Java对象,在Matlab中调用Jython会不会更方便一些。但是由于不怎么懂Java,所以就没有付诸实践。前段时间,发现在Matlab中使用C#编写的代码很方便,见《让Matlab的任务栏图标显示进度(For
Win7)》,于是想,在Matlab中使用IronPython也应该不难吧。而且Matlab对于dotNet的支持还算全面,包括Generic,Delegate什么的。

    今天晚上稍微试验了一下,发现确实不难。下面的代码是参照IronPython文档中的C#的例子写的。虽然我不怎么会玩C#,但是因为例子比较简单,看看就明白了。这也是我第一次玩IronPython,以前都没有装过。
% 2011.12.20 PM 09:50
% Matlab 7.12.0
% IronPython 2.7.1
% xialulee

NET.addAssembly('IronPython');

import IronPython.Hosting.*

engine = Python.CreateEngine();

scope = engine.CreateScope();

engine.CreateScriptSourceFromString('f = lambda x: x+3').Execute(scope);

f = NET.invokeGenericMethod(scope, 'GetVariable', ...

    {NET.GenericClass('System.Func', 'System.Object', 'System.Object')}, 'f');

fprintf('f(2) = %d\n', f(2));
% output: f(2) = 5


稍微解释一下。创建IronPython的engine和scope,这些都不用说了。关键是scope的GetVariable方法,这个方法有Generic和non-Generic两个版本,其中Generic版本能够实现类型的转换,比如获取一个Python的callable对象时,其Generic的版本能够直接返回一个delegate。上面的例子中,在scope里用lambda创建了一个函数f,它有一个参数x。如果调用GetVariable时指定type parameter为Func<object, object>,则返回值为IronPython中的函数f对应的dele
4000
gate对象。之所以Func中有两个object,是因为第一个object代表的是参数,第二个是返回值。

    今天只是简单试了试。没有继续深入探究。由于Matlab支持将Matlab函数转换成dotNet的delegate对象,想必以后可以琢磨出一些比较复杂的玩法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: