我试图在Python中做不完全Cholesky分解,但我找不到直接的Python包。
由于我能在网上找到的大多数可用代码都是用Matlab编写的,因此我想绕过
- 将matlab代码编译为共享库(我使用Mac OS和MATLAB_R2014a,因此它应该产生
.dylib
文件) - 在Python中使用Ctypes加载库
下面列出了详细的步骤:
<标题> 0。下载Matlab源代码代码可从F. Bach的网页链接下载到zip文件,其中包含以下文件:
panc:csi-1.0 panc25$ ls
center.m csi.dll csi.mexglx csi_gaussian.dll csi_gaussian.mexglx readme.txt
csi.c csi.m csi_gaussian.c csi_gaussian.m demo_csi.m sqdist.m
<标题> 1。将matlab代码编译为共享库然后按照这篇文章,我运行命令:
mcc -v -W cpplib:libcsi -T link:lib csi
大约一分钟后,终端打印出MEX completed successfully
,在我的文件夹中有
panc:csi-1.0 panc25$ ls
center.m csi.m csi_gaussian.dll demo_csi.m libcsi.exports readme.txt
csi.c csi.mexglx csi_gaussian.m libcsi.cpp libcsi.h sqdist.m
csi.dll csi_gaussian.c csi_gaussian.mexglx libcsi.dylib mccExcludedFiles.log
其中libcsi.dylib
是我想要的共享库。
然后我打开IPython
并尝试加载库:
In [1]: import ctypes
In [2]: ctypes.C
ctypes.CDLL ctypes.CFUNCTYPE
In [2]: ctypes.CDLL('libcsi.dylib')
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-2-b6d0c1a91651> in <module>()
----> 1 ctypes.CDLL('libcsi.dylib')
/Users/panc25/anaconda/lib/python2.7/ctypes/__init__.pyc in __init__(self, name, mode, handle, use_errno, use_last_error)
363
364 if handle is None:
--> 365 self._handle = _dlopen(self._name, mode)
366 else:
367 self._handle = handle
OSError: dlopen(libcsi.dylib, 6): Library not loaded: @rpath/libmwmclmcrrt.8.3.dylib
Referenced from: /Users/panc25/Downloads/csi-1.0/libcsi.dylib
Reason: image not found
即使我将ctypes.CDLL('libcsi.dylib')
中的文件名替换为完整路径,这个问题仍然存在。
所以我很困惑。共享库在那里,但是为什么Python说"image not found"?
<标题>顺便说一句由于源代码还通过mex.h
提供C实现,我还尝试先创建一个.mex
文件,然后将.mex
编译为共享库,如下所示:
panc:csi-1.0 panc25$ mex csi.c
创建了csi.mexmaci64
文件。然后根据这个链接,我打电话给:
panc:csi-1.0 panc25$ mcc -B csharedlib:csi2 csi.mexmaci64
生成csi2.dylib
文件
但是当我试图在Python中加载它时,我有同样的错误。
谁能让我知道什么是错的?
标题>标题>标题>标题>我将完全避免使用Matlab,而是使用PyMC2中提供的不完全乔里斯基分解:
from pymc.gp.incomplete_chol import ichol_full
可以在这里找到f2py包装的Fortran代码,它实际上是改编自一个MEX文件。因此,如果需要,您可以独立于PyMC2使用它。
如果您感兴趣,您也可以建议将此函数添加到sciy(请参阅此github问题)。