我试图反转一个大的(150000,150000)
稀疏矩阵如下:
import scipy as sp
import scipy.sparse.linalg as splu
#Bs is a large sparse matrix with shape=(150000,150000)
#calculating the sparse inverse
iBs=splu.inv(Bs)
Run Code Online (Sandbox Code Playgroud)
导致以下错误消息:
Traceback (most recent call last):
iBs=splu.inv(Bs)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 134, in spsolve
autoTranspose=True)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 603, in linsolve
self.numeric(mtx)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 450, in numeric
umfStatus[status]))
RuntimeError: <function umfpack_di_numeric at 0x7f2c76b1d320> failed with UMFPACK_ERROR_out_of_memory
Run Code Online (Sandbox Code Playgroud)
我重新编写了程序来简单地求解线性微分方程组:
import numpy as np
N=Bs.shape[0]
I=np.ones(N)
M=splu.spsolve(Bs,I)
Run Code Online (Sandbox Code Playgroud)
我又遇到了同样的错误
我在具有16 GB RAM的计算机上使用此代码,然后将其移动到具有32 GB RAM的服务器上,仍然无济于事.
有没有人遇到过这个?
我正在使用ublas :: Compressed Matrix来处理稀疏线性求解器UMFPACK.由于我正在进行模拟,所以每次线性系统的构造都略有不同,可能涉及扩大/缩小系数矩阵和一些稀疏矩阵乘法.线性系统的规模约为25k.
即使有一个绑定补丁用于增强与UMFPACK一起工作,我仍然需要不时更改矩阵,有时甚至计算非零值的数量将是耗时的(理想情况下,我必须给出数字当我初始化矩阵时的非零值).另外,我使用ublas :: range动态追加列/行.
所以我的问题是:有没有有效的方法来做到这一点?现在对我来说太慢了.转换尺寸为15k的矩阵成本接近6s并且附加大约12k行是很快的(因为我猜它是行主矩阵),但是向矩阵添加相同数量的列可能花费多达20s(我想同样的如上所述,所以即使我使用了列主矩阵,所需的总时间也是相同的).
有点在这里绝望.任何建议都是受欢迎的.
干杯.
我正在使用用于Boost UBlas的数值库绑定来解决简单的线性系统.以下工作正常,但它仅限于处理相对较小的'm'的矩阵A(mxm).
在实践中,我有一个更大的矩阵,维数m = 10 ^ 6(最多10 ^ 7).
是否存在用于解决有效使用内存的Ax = b的现有C++方法.
#include<boost/numeric/ublas/matrix.hpp>
#include<boost/numeric/ublas/io.hpp>
#include<boost/numeric/bindings/traits/ublas_matrix.hpp>
#include<boost/numeric/bindings/lapack/gesv.hpp>
#include <boost/numeric/bindings/traits/ublas_vector2.hpp>
// compileable with this command
//g++ -I/home/foolb/.boost/include/boost-1_38 -I/home/foolb/.boostnumbind/include/boost-numeric-bindings solve_Axb_byhand.cc -o solve_Axb_byhand -llapack
namespace ublas = boost::numeric::ublas;
namespace lapack= boost::numeric::bindings::lapack;
int main()
{
ublas::matrix<float,ublas::column_major> A(3,3);
ublas::vector<float> b(3);
for(unsigned i=0;i < A.size1();i++)
for(unsigned j =0;j < A.size2();j++)
{
std::cout << "enter element "<<i << j << std::endl;
std::cin >> A(i,j);
}
std::cout << A << std::endl;
b(0) = 21; b(1) = 1; b(2) = …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个好的(在最好的情况下积极维护)C++矩阵库.因此它应该是模板化的,因为我想使用复数的有理数作为数字类型.我正在处理的矩阵主要是稀疏和单一的.
你能否建议图书馆,并给出一个小解释,为什么要使用它们,因为我知道如何找到它们,但我无法真正决定什么适合我,因为我错过了它们的经验.
编辑:
我正在处理的主要操作是矩阵乘法,带矢量和kronecker乘积的标量乘法.矩阵的大小是指数级的,我想至少能够处理高达1024x1024个条目的矩阵.
我正在尝试在 OSX 10.8 上编译一个名为 hiQlab 的程序
g++ -g -O2 -I`echo /Users/.../Documents/hiQlab/hiqlab-2006-07-20/tools/`/lua/include -I`echo /Users/.../Documents/hiQlab/hiqlab-2006-07-20/tools/`/tolua++/include -c cscmatrix.cc
cscmatrix.cc:13:12: fatal error: 'umfpack.h' file not found
#include "umfpack.h"
Run Code Online (Sandbox Code Playgroud)
但我刚刚通过 macports 安装了 SuiteSparse,其中包括 umfpack,并且umfpack.h
实际上存在于默认目录中/opt/local/include/
我需要添加路径什么的吗?
好吧,经过更多搜索后,我找到了答案——我没有将 macports 路径添加到我的搜索路径中
多么愚蠢=p,由于我在 8 小时内无法回答自己的问题,所以我将在这里编辑
vi ~/.profile
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MANPATH=/opt/local/share/man:$MANPATH
export C_INCLUDE_PATH=/opt/local/include
export CPLUS_INCLUDE_PATH=/opt/local/include
export LIBRARY_PATH=/opt/local/lib
alias gcc="gcc -I/opt/local/include -L/opt/local/lib"
alias g++="g++ -I/opt/local/include -L/opt/local/lib"
Run Code Online (Sandbox Code Playgroud) 我在数字代码中使用Boost的uBLAS,并且有一个"重"解算器:
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?LU_Matrix_Inversion
代码工作得很好,然而,它很慢.经过一些研究,我找到了UMFPACK,它是一个稀疏矩阵求解器(除此之外).我的代码生成大型稀疏矩阵,我需要非常频繁地反转(更正确地解决,逆矩阵的值是无关紧要的),因此UMFPACk和BOOST的Sparse_Matrix类似乎是一个幸福的婚姻.
UMFPACK请求由三个向量指定的稀疏矩阵:条目计数,行索引和条目.(见例).
我的问题归结为,我可以从BOOST的Sparse Matrix类中有效地获得这三个向量吗?