cholesky_At投掷L和B的尺寸不匹配

时间:2018-01-16 02:17:10

标签: python numpy scipy numeric scikits

我试图用Cholesky方法求解线性方程组(Ax = b)。 A是稀疏的对角占优矩阵。但是在尝试解决时,我收到一个错误:“L和B的尺寸不匹配”。我对Cholesky并不是很熟悉,到目前为止我还没弄清楚这个问题。重现的相关代码如下:

from scikits.sparse.cholmod import cholesky_AAt
import scipy.sparse

row = 12
w = 2
h = 2

datab = [-0.1424664938036192, 0, 0, -0.10303063143932194, 0, 0, -0.040151087842721742, 0, 0, -0.043413238389510278, 0, 0]
dataA = [0.5, 0.0, 0.0, 0.0, -0.0, 0.0, -0.0, 0.0, 0.70710678118654757, 0.0, 0.0, 0.0, 0.0, -0.0, 0.0, 0.70710678118654757, -0.0, -0.0, -0.0, -0.0, 0.0, -0.0, 0.8660254037844386, -0.0, -0.0, -0.0, 0.0, -0.0]
rowA_i = [0, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 8, 9, 10, 10, 10, 11, 11]
colA_i = [0, 0, 2, 3, 0, 1, 3, 3, 1, 1, 3, 2, 1, 0, 2, 2, 2, 0, 1, 2, 3, 1, 3, 3, 1, 0, 3, 2]

A = scipy.sparse.csc_matrix((dataA, (rowA_i, colA_i)), shape=(row, w*h))
b = np.array(datab)

factor = cholesky_AAt(A.T)
x = factor(A.T * b)

我看到的具体错误是:

CholmodError                              Traceback (most recent call last)
<ipython-input-94-bf6984dae484> in <module>()
 23 from scikits.sparse.cholmod import cholesky_AAt
 24 factor = cholesky_AAt(A.T)
---> 25 x = factor(A.T * b)
 26 
 27 

scikits/sparse/cholmod.pyx in scikits.sparse.cholmod.Factor.__call__ 
(scikits/sparse/cholmod.c:8036)()

 scikits/sparse/cholmod.pyx in scikits.sparse.cholmod.Factor.solve_A 
 (scikits/sparse/cholmod.c:7913)()

 scikits/sparse/cholmod.pyx in scikits.sparse.cholmod.Factor._solve 
(scikits/sparse/cholmod.c:9713)()

scikits/sparse/cholmod.pyx in scikits.sparse.cholmod.Factor._solve_dense 
(scikits/sparse/cholmod.c:10126)()

scikits/sparse/cholmod.pyx in scikits.sparse.cholmod._error_handler 
(scikits/sparse/cholmod.c:3270)()

CholmodError: ../Cholesky/cholmod_solve.c:1082: dimensions of L and B 
do not match (code -4)

根据我对Cholesky解算器的理解,这应该有效,但是我 不能说不止于此。任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的代码使用(合理的)现代设置,虽然它需要其他导入样式,因为scikit-sparse似乎在这方面有所改变。 (这个事实也表明你使用的是旧版本。)

代码

您的代码包含一些修改后的导入和打印:

import numpy as np
import scipy.sparse
from sksparse.cholmod import cholesky_AAt

row = 12
w = 2
h = 2

datab = [-0.1424664938036192, 0, 0, -0.10303063143932194, 0, 0, -0.040151087842721742, 0, 0, -0.043413238389510278, 0, 0]
dataA = [0.5, 0.0, 0.0, 0.0, -0.0, 0.0, -0.0, 0.0, 0.70710678118654757, 0.0, 0.0, 0.0, 0.0, -0.0, 0.0, 0.70710678118654757, -0.0, -0.0, -0.0, -0.0, 0.0, -0.0, 0.8660254037844386, -0.0, -0.0, -0.0, 0.0, -0.0]
rowA_i = [0, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 8, 9, 10, 10, 10, 11, 11]
colA_i = [0, 0, 2, 3, 0, 1, 3, 3, 1, 1, 3, 2, 1, 0, 2, 2, 2, 0, 1, 2, 3, 1, 3, 3, 1, 0, 3, 2]

A = scipy.sparse.csc_matrix((dataA, (rowA_i, colA_i)), shape=(row, w*h))
b = np.array(datab)

factor = cholesky_AAt(A.T)
x = factor(A.T * b)

print(x)

输出:

sascha@ubuntu-17:~/Documents$ python3 so_scikit_sparse.py
so_scikit_sparse.py:17: CholmodTypeConversionWarning: converting matrix of class csr_matrix to CSC format
  factor = cholesky_AAt(A.T)
[-0.28493299 -0.14570732 -0.05678221 -0.05012929]

所以一切正常!此警告的原因在文档中进行了解释,可以通过更改稀疏矩阵的类型来禁止(提示:CSR / transpose / CSC)。

这个观察以及对文档的简短阅读让我相信你做的一切都正确(在代码中)!

这里的原因是(可能)numpy,(scipy)和/或suitesparse的一些变化,如这些问题所示@ github:123

我的版本:

  • numpy:1.12.1-3
  • scipy:0.18.1
  • scikit-sparse:0.4.2
  • libsuitesparse-dev:4.5.5-1

以上是你得到的:

  • 使用Ubuntu 17.10的OS-packages for python3-numpy,python3-scipy
  • 使用libsuitesparse-dev的OS-packages
  • pip3 install scikit-sparse