2

我正在尝试在 Python 中进行不完整的 Cholesky 分解,但我找不到直接的 Python 包。

由于我可以在网上找到的大多数可用代码都是用 Matlab 编写的,所以我想绕道

  • 将 matlab 代码编译为共享库(我使用的是 Mac OS 和 MATLAB_R2014a,所以它应该生成.dylib文件)
  • 使用 Ctypes 在 Python 中加载库

下面列出了详细的步骤:

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我想要的共享库在哪里。

2.在Python中加载库

然后我打开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 说“找不到图像”?

顺便提一句

由于源代码也通过C实现mex.h,所以我也尝试先创建一个.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 中加载它时,我遇到了同样的错误。

谁能让我知道出了什么问题?

4

1 回答 1

2

我会完全避免使用 Matlab,而是使用 PyMC2 中可用的不完全 Cholesky 分解:

from pymc.gp.incomplete_chol import ichol_full

可以在此处找到实际上改编自 MEX 文件的 f2py 包装的 Fortran 代码。因此,如果需要,您可以独立于 PyMC2 使用它。

如果您有兴趣,也可以建议将此功能添加到 scipy(请参阅此githib 问题)。

于 2015-07-13T07:37:35.153 回答