mlab是一个从python到matlab的高级桥,它让matlab看起来像一个普通的python库

mlab的Python项目详细描述


mlab是一个从python到matlab的高级桥,它让matlab看起来像一个普通的python库。
这个python库基于原始mlabwrap项目的工作
http://mlabwrap.sourceforge.net/
和dani valevski(来自dana pe'er的实验室):
http://code.google.com/p/danapeerlab/source/browse/trunk/freecell/depends/common/python/matlabpipe.py
primer


quick installation:



从本地安装的Matlab版本开始使用库:

rt matlabroot

print matlabroot()

发现机制是由mlab.releases模块实现的,因此必须通过导入指定要首先使用的版本。只有这样,您才能从Matlab模块导入:


from MLAB.releases import r2010b
from Matlab import Matlabroot


另请参见mlab.releases.get_available_releases()。


contents



description




news




加载

installation




documentation


tutorial


与其他现有模块的比较

缺少什么?

实施说明

疑难解答


Matlab r2008a下的奇怪挂起



"无法打开引擎"

windows

/>
感谢您在这个非常有用的python工具上所做的出色工作!

George A.Blaha,高级系统工程师,
Raytheon综合防御系统





related


这里有一份mlabwrap v1.1-pre(http://mlabwrap.sourceforge.net/)补丁
tp://sourceforge.net/mailarchive/message.php?msg_id=27312822


使用修补程序修复错误:



还请注意,在ubuntu中,您需要sudo apt get install csh

有关详细信息,请参见http://github.com/aweinstein/mlabwrap
news


2014-08-26 1.1.3应用修补程序通过COM添加对Windows的支持。
对sergey matyunin的信任,amro@stackoverflow

2013-07-26 1.1.1将库重新打包为MLAB项目。包括用于Windows的代码
(matlabraw.cpp暂时关闭)。

2009-10-26 1.1修复了mlabraw.cpp中导致某些用户编译问题的错误声明,并结合了Alan Brooks建议的用于Windows的
setup.py修复。更重要的是
有一个新的spiffy标志!

2009-09-14 1.1-pre终于带来了N-D阵列支持,感谢加入该项目的Vivek
Rathod!还修复了savevarsinmat
(感谢nicolas pinto)缺少的导入。

兴高采烈地验证engdemo.c是否工作是一个很好的试金石(请参阅故障排除)。

2009-03-23 1.0.1终于出来了。这是一个小版本,它修复了mlabwrap中一些恼人但主要是小错误(它也稍微改进了去掉了对代理对象的
索引支持,但是精确的语义仍然需要更改。)


/>
稀疏Matlab矩阵现在已正确处理
(mlab.sparse([0,0,0,0])现在将返回稀疏双数组的代理,而不是将at错误地视为普通双数组并返回
垃圾或崩溃)。


e
使用自制的Matlab助手类进行单元测试。

麻省理工学院的Pinto让
他们自己来帮我测试我那愚蠢的破版
候选版本。
许可证

许可证,请参阅mlabraw.cpp。
下载

<;http://github.com/ewiger/mlab>;
安装


mlab应适用于python>;=2.7(到python 2.2,有少量coasing)和
安装了numpy(推荐)或numeric(过时)并且maTLAB 6、6.5、
7.x和8.x,在32位或64位
计算机上的Linux、OS X和Windows(请参阅OS X)下。




确保python path已相应设置。)

如果出现问题,请参阅故障排除。

windows

您可以使用christoph gohlke提供的软件包:http://www.lfd.uci.edu/~gohlke/pythonlibs/也可以查看官方网站
scipy的最新状态,这可能是:

easy_install.exe numpy


<;string>;:175:(警告/2)需要文字块;未找到。

<;string>;:5:(信息/1)枚举列表起始值不是序号-1:"2"(序号2)


easy_install.exe pywin32


另请参阅Windows中的"疑难解答"。
>>>>从mlab.releases导入最新版本为matlab
>;>>matlab.plot([1,2,3],'-o')


>丑陋的plot

>稍微漂亮一点的示例

>;>从mlab.releases导入最新版本为matlab
>;>从numpy导入*
>;>xx=arange(-2*pi,2*pi,0.2)
>;>mlab.surf(减去外部(sin(xx),cos(xx)))


surface plot

告诉我有关mlabwrap的信息。
兼容性注意:由于Matlab变得越来越少
双中心,默认的转换规则可能在post 1.0
mlabwrap中发生变化;因此,当使用mlab.plot([1,2,3])而不是
mlab.plot(array([1,2,3.])时,可以像在
下面的教程,建议在生产代码中使用后者。]

因此,首先导入mlab伪模块,然后
数值:

>;>from mlab import mlab
>;>import numpy

价值分解选项。
s v d奇异值分解。
[…]

=svd(x)生成一个对角线矩阵s,它的维数与x相同,并且在
[…]


>中有非负对角线元素,然后尝试:

>;>mlab.svd(array([[1,2],[1,3]])
array([[3.86432845],
[0.258777718])

ack——这是因为python没有像matlab的多值返回这样的东西。由于根据所请求的输出参数的数量,Matlab函数可以有完全不同的行为,因此如果您想要超过1,就必须显式地指定。因此,要得到
'u'以及's'和'v',您需要:

>;>;u,s,v=mlab.s v d([[1,2],[1,3]],nout=3)


因此没有
标量或"平面"向量。它们分别对应于1x1和1xn矩阵
。因此,当您将平面向量或标量传递给
mlab函数时,它是自动转换的。此外,整数值会自动转换为双浮点数。下面是一个例子:

>;array([[1.]])


strings也可以按预期工作:

>;'abcde'

也可以返回结构,或者确实返回不能转换为python等价物的
类和其他类型。然而,mlabwrap并不是放弃,而是通过使用代理来向用户隐藏这个事实:
例如,创建一个包含2个输入、3个隐藏和1个输出节点的netlab神经网络:

>;>net=mlab.mlp(2,3,1,'logistic')

t>>net
<;Matlab类的mlabobjectProxy:'struct';内部名称:'proxy_val0_uuu';
具有父级:no>;
类型:'mlp'
in:3
nhidden:3
nout:3
nwts:24
outwn:'linear'
w1:[3x3 double]
b1:[0.0873-0.0934 0.3629]
w2:[3x3 double]
b2:[-0.6681 0.3572 0.8118]


当网络或其他代理对象a传递给mlab函数时,它们会自动转换为相应的matlab对象。为了获得一个关于"异或"问题的训练网络,人们可以简单地做:


>>>gt;net=mlab.mlptrain(net,[[1,1],[0,0,0],[1,0,0],[0,0,1,1,1,1000]mlab.mlptrain(net,[[1,1,1,[0,1,1,1,1,1,1,1000]




>>;mlab.mlpfwd(net2,[[1,0]]]


>数组([[1.1]]]]]]>a数组([[1.1.[[1.1.]]]]]]gt;mlab.mlpfwd(net2,[[1,1]])
数组([[7.53175454e-09]])


如前所述,通常在使用代理对象时根本不应该注意;它们甚至可以被pickle(!),尽管这还有些实验性。


mlabwrap还提供了正确的错误处理和异常!因此,尝试仅将一个输入传递到具有两个输入节点的网络时会引发异常:

>;>mlab.mlpfwd(net2,1)
回溯(最近一次调用的最后一次):
[…]
mlabraw.error:error using==>;mlpfwd
输入1的维度与模型输入2的数量不匹配

w也会显示警告消息(以及发送到stdout的消息):

>;>mlab.log(0)
警告:log of zero。
数组([[-inf]])

使用pymat执行与第一个示例类似的操作(基于pymat的底层mlabraw接口)。

this:

>;>a,b,c=mlab.svd([[1,2][1,3]],[0,nout=3)




>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>会话=pymat.open()
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>A=pymat.get(会话,'a')
>;>;b=pymat.get(session,'b')
>;>;c=pymat.get(session,'c')

当然,像上面的netlab示例(它使用代理在python中表示matlab类实例)这样更奇特的东西是不可能以类似的方式在pymat中实现的。错误报告);基本上只需将pymat替换为上面的
mlabraw并使用mlab.\u session作为session),即从mlab导入mlab
>;>;导入mlabraw
>;>;mlabraw.put(mlab.\u session,"x"、[[1,2]、[1,3]])
[…]


应该扪心自问,这是否真的是个好主意;
与Matlab的C接口相关的固有开销似乎很高,因此额外的Python开销通常不太重要——如果
效率成为一个问题,那么最好尝试将
seve在.m文件中使用ral matlab命令,以减少
matlab调用的次数。如果您正在寻找一种执行"raw"Matlab以实现特定目的的方法,那么mlab.do可能是一个更好的主意。在未来的mlabwrap版本中,低级的mlabraw
api更有可能以完全向后不兼容的方式进行更改。你被警告了。



处理3级或3级以上的as数组,以及
非双/复数组(目前,不支持将所有内容转换为
双/复数组以传递给Matlab,并从
Matlab传递非双/复数组)。两者都应该很容易实现,
但并不是很多人都要求这样做,而且我还没有找到解决办法。


更好地支持单元。

如果您认为有必要,请告诉我(在
stackoverflow标记的查询中);目前,您可以/可能/避免
在每个线程中使用一个单独的mlabwrap对象,而不需要实现自己的
锁定,但即使这样也没有经过测试。

/>那么这一切是如何运作的呢?

我有一个c扩展模块(pymat的一个修正版,pymat是一个开源的低级python-matlab接口),负责打开matlab会话,将matlab命令作为字符串发送到运行matlab会话和转换数值arrays(以及序列和
字符串…)到Matlab矩阵,反之亦然。在此基础上,我构建了一个
纯python模块,它带有各种铃声和口哨声,给人的印象是
提供了一个matlab"模块"。

这是由一个管理单个matlab会话(其中mlab
是一个实例)并动态创建带有docstring的方法的类完成的。因此,在mlab.abs(1)的第一次调用中,包装器将查看缓存中是否已经有一个匹配函数。如果没有,则在Matlab中查找abs的docstring
,并使用Matlab脆弱的自省能力来确定输出参数的数量(0或更多),然后动态创建一个具有右
docstring的函数并将其分配给mlab.abs。此函数负责所有输入参数和返回值的转换,必要时使用代理。代理更为复杂,proxy
pickling方案使用Matlab的save命令创建一个二进制版本的
代理的内容,然后将其与proxy o对象由
python本身。希望这给了一个模糊的想法,为了获得更多的信息,请研究源代码。






看起来这一特定版本的matlab可能会坏掉(我可以用64位下的精简engdemo.c重现问题因纽斯)据报告,r2008b工作正常(与以前的几个
版本一样)。


Matlab不在path

信息,因此它必须在您的路径中
,除非您通过提交setup.py。当然,要想能够以任何方式使用mlabwrap,Matlab无论如何都必须在您的路径上
(除非您设置了环境变量mlabraw_cmd_str,该变量指定应该如何调用Matlab)。

"无法打开引擎"

无法启动Matlab(TM)引擎
,那么您可能使用的是不兼容的C++编译器(或版本),或者如果使用UNIX是BR/>,则可能没有安装在/BI/CSH下的CSH,请参见下面。提供了详细的说明,但简而言之:
将其复制到具有写访问权限的目录,并执行
(假设在/opt/matlabr14中安装了Matlab,并且运行的是Unix,
否则根据需要进行修改):

./engdemo

如果无法启动Matlab引擎,则可能是您正在尝试使用MathWorks的兼容编译器列表中没有的编译器版本,或是您的编译器/Matlab安装中的其他内容已损坏,需要在成功构建mlabwrap之前解决该问题。很有可能你或者你的机构给MathWorks付了很多钱,所以他们应该乐于给你一些技术支持。以下是一些最近获得matlab 7.04的mex支持的用户,他们在一次
交换支持报告后,在ubuntu edgy下工作;除了安装gcc-3.2.3之外,他还做了以下工作:


en select:2-gcc mex选项
>;optsfile=[matlabroot'/bin/engopts.sh'];
>;mex-v-f optsfile'engdemo.c';
>;!./engdemo;

update john bender reports在unix下csh需要安装在
/bin/csh中,以便让matlab外部引擎工作——因为许多linux
发行版默认不安装csh,您可能需要执行类似于
sudo apt g e t install csh的操作(例如在ubuntu或其他基于debian的系统)。他还指出了这个有用的engdemo疑难解答页面,位于mathworks(tm)站点。


"`glibcxx_3.4.9'未找到"关于导入mlab(或类似的)


如上所述,首先尝试查看是否可以让engdemo.c工作,因为只要连matlab附带的示例都没有编译,
mlabwrap编译的可能性相当小。好的一面是
如果问题不是mlabwrap特定的,mathworks和/或
matlab特定的支持论坛应该能够提供帮助。


旧的matlab版本


使用此函数)

那么您可能使用的是旧版本的Matlab(即<;6.5);
setup.py应该已经检测到了这一点(尝试手动调整
Matlab_版本并给我写一个错误报告)。



关于运行的说明

在运行python之前,请运行:


export dyld_library_path=$dyld_library_path$:/applications/matlab701/bin/mac/
export mlabraw_cmd str=/applications/matlab701/bin/matlab

[编辑:我不确定dyld_library_path修改是否仍然存在必要的。]


就图形命令而言,需要从x11 xterm中运行python解释器才能在屏幕上显示任何内容。
ie,对于懒惰的人来说,mlabwrap import mlab;mlab.plot([1,2,3],'-o')


除非python是从xterm运行的,并且Matlab启动字符串
更改为:


export mlabraw_cmd_str="/applications/matlab701/bin/Matlab-nodesktop"


<;string>;:529:(info/1)重复的隐式目标名称:"windows"。

我自己使用Windows,但是我尝试在Windows下保持MLBACLUP工作
,我依赖Windows用户的反馈。
BR/>因为Windows下有几个流行的C++编译器,你可能不得不用BR/>告诉StupU.Py哪一个你想使用(除非它是VC 7)。e A. Blaha给了我一个Borland C++支持的补丁;在StupU.Py中搜索"Borland
BR/> Dylan T Walker编写的WIMW32也会很好,但出于某种原因
(DIdStuff-GLIGHY?)需要以下调用:

>;setup.py build--compiler=mingw32
>;setup.py install--skip build

ich将导致错误消息
,因为没有实现对python的回调(我甚至不认为
是可行的)。虽然没有通用的解决方法,但在某些情况下,您可以动态地创建一个等效的Matlab函数,例如执行如下操作:mlab.fzero(mlab.eval('@(x)x^2-2',0))。


在某些情况下,可能需要在Matlab中直接访问或设置全局变量。在这些情况下,您可以使用mlab.\u get('some_var')
和mlab.\u set('some_var',some value)。
支持和反馈


>使用标记Matlab、mlab
和Python


credits

Alejandro Weinstein来获取1.1pre
https://gith的补丁ub.com/aweinstein/mlabwrap

alexander schmolck和vivek rathod for mlabwrap:
vements
(我做了一些调整),以进一步减少安装时对手动用户的干预。


e向setup.py或mlabraw.cpp(joris van
zwieten、george a.blaha和其他人)提供补丁的人。

Matlab是MathWorks的注册商标。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Jgit对于给定的存储库,我们如何确定新提交的列表,以及每个提交来自哪个分支?   从MS Access数据库添加java ComboBoxItem   如何禁止Java列表中不同类的实例?   java在没有Web的JAXR上使用Shiro过滤器。xml   由于java原因,无法在Ubuntu上安装Netbeans 8.2。awt。未找到恐怖和辅助技术   java JUnit对RuntimeException的处理(特别是)   java空集合在Apache CXF服务(JAXWS)中被转换为null   java CannotAcquireLockException问题   sql如何在数据库中对(Java)枚举建模(使用SQL92)   安卓在Java中获取友好url后面的文件名   java如何访问数组名以获取列表?   javascript Java Nashorn longBitsToDouble   java控制台<init>错误   java将一个LinkedList追加/连接到另一个LinkedList的最有效方式是什么?   Java for正在跳过的循环   java帮助创建带有动画的复杂Swing GUI   java Android编辑文本。setHint在片段中不工作