cholesky_AAt L 和 B 的投掷尺寸不匹配
cholesky_AAt throwing dimensions of L and B do not match
我正在尝试使用 Cholesky 方法求解线性方程组 (Ax = b)。 A 是稀疏对角占优矩阵。但是,在尝试解决时,出现错误:"dimensions of L and B do not match"。我对 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 求解器的理解,这应该可行,但我
不能说更多。任何指导将不胜感激。
您的代码适用于(合理的)现代设置,尽管它需要其他导入样式,因为 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/转置/CSC)。
这一观察以及对文档的简短阅读让我相信您所做的一切都是正确的(在代码中)!
这里的原因(可能)是 numpy 的一些变化,(scipy) and/or suitesparse 如这些问题中所示 @ github: 1, 2, 3
我的版本:
- numpy:
1.12.1-3
- scipy:
0.18.1
- scikit-稀疏:
0.4.2
- libsuitesparse-dev:
4.5.5-1
以上是你得到的:
- 使用 OS-packages with Ubuntu 17.10 for python3-numpy, python3-scipy
- 为 libsuitesparse-dev 使用 OS-packages
- pip3 安装 scikit-sparse
我正在尝试使用 Cholesky 方法求解线性方程组 (Ax = b)。 A 是稀疏对角占优矩阵。但是,在尝试解决时,出现错误:"dimensions of L and B do not match"。我对 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 求解器的理解,这应该可行,但我 不能说更多。任何指导将不胜感激。
您的代码适用于(合理的)现代设置,尽管它需要其他导入样式,因为 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/转置/CSC)。
这一观察以及对文档的简短阅读让我相信您所做的一切都是正确的(在代码中)!
这里的原因(可能)是 numpy 的一些变化,(scipy) and/or suitesparse 如这些问题中所示 @ github: 1, 2, 3
我的版本:
- numpy:
1.12.1-3
- scipy:
0.18.1
- scikit-稀疏:
0.4.2
- libsuitesparse-dev:
4.5.5-1
以上是你得到的:
- 使用 OS-packages with Ubuntu 17.10 for python3-numpy, python3-scipy
- 为 libsuitesparse-dev 使用 OS-packages
- pip3 安装 scikit-sparse