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

原文地址: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);
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对应的delegate对象。之所以Func中有两个object,是因为第一个object代表的是参数,第二个是返回值。
      今天只是简单试了试。没有继续深入探究。由于Matlab支持将Matlab函数转换成dotNet的delegate对象,想必以后可以琢磨出一些比较复杂的玩法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值