[英]SVD to solve harwell-boeing sparse a.x=b system in C/C++?
有人知道 c++ 的稀疏 SVD 求解器嗎? 我的問題涉及一些可能將列/行歸零的條件不佳的矩陣。 我的數據存儲在 uBLAS 矩陣中,該矩陣是 Harwell-Boeing 稀疏格式。
我很難找到:
SVD 求解器
我希望從 GSL 重新創建以下兩個步驟
gsl_linalg_SV_decomp_jacobi (gsl_matrix * A, gsl_matrix * V, gsl_vector * S)
gsl_linalg_SV_solve (const gsl_matrix * U, const gsl_matrix * V, const gsl_vector * S, const gsl_vector * b, gsl_vector * x)
我也不知道如何在 c++ 中包裝 FORTRAN 庫。 哪里/有任何 PROPACK c/c++ 綁定?
編輯 1:我在使用 PROPACK 時遇到了一些問題。 PROPACK output 是否稀疏矩陣? output V 似乎為“V(LDV,KMAX):雙精度數組”。 這意味着它沒有?
SVDLIBC是一個 C 庫,部分支持 Harwell-Boeing格式。 我不熟悉該庫,但表面上它似乎符合您的要求。
你提到了 PROPACK 。 Fortran 是 C 兼容的,你只需要知道調用約定是如何工作的。 我不確定,但我認為您要在 PROPACK 中調用的 function 是dlansvd
(假設為雙精度),記錄如下:
subroutine dlansvd(jobu,jobv,m,n,k,kmax,aprod,U,ldu,Sigma,bnd,
c V,ldv,tolin,work,lwork,iwork,liwork,doption,ioption,info,
c dparm,iparm)
c DLANSVD: Compute the leading singular triplets of a large and
c sparse matrix by Lanczos bidiagonalization with partial
c reorthogonalization.
c
c Parameters:
c
c JOBU: CHARACTER*1. If JOBU.EQ.'Y' then compute the left singular vectors.
c JOBV: CHARACTER*1. If JOBV.EQ.'Y' then compute the right singular
c vectors.
c M: INTEGER. Number of rows of A.
c N: INTEGER. Number of columns of A.
c K: INTEGER. Number of desired singular triplets. K <= MIN(KMAX,M,N)
c KMAX: INTEGER. Maximal number of iterations = maximal dimension of
c the generated Krylov subspace.
c APROD: Subroutine defining the linear operator A.
c APROD should be of the form:
c
c SUBROUTINE DAPROD(TRANSA,M,N,X,Y,DPARM,IPARM)
c CHARACTER*1 TRANSA
c INTEGER M,N,IPARM(*)
c DOUBLE PRECISION X(*),Y(*),DPARM(*)
c
c If TRANSA.EQ.'N' then the function should compute the matrix-vector
c product Y = A * X.
c If TRANSA.EQ.'T' then the function should compute the matrix-vector
c product Y = A^T * X.
c The arrays IPARM and DPARM are a means to pass user supplied
c data to APROD without the use of common blocks.
c U(LDU,KMAX+1): DOUBLE PRECISION array. On return the first K columns of U
c will contain approximations to the left singular vectors
c corresponding to the K largest singular values of A.
c On entry the first column of U contains the starting vector
c for the Lanczos bidiagonalization. A random starting vector
c is used if U is zero.
c LDU: INTEGER. Leading dimension of the array U. LDU >= M.
c SIGMA(K): DOUBLE PRECISION array. On return Sigma contains approximation
c to the K largest singular values of A.
c BND(K) : DOUBLE PRECISION array. Error estimates on the computed
c singular values. The computed SIGMA(I) is within BND(I)
c of a singular value of A.
c V(LDV,KMAX): DOUBLE PRECISION array. On return the first K columns of V
c will contain approximations to the right singular vectors
c corresponding to the K largest singular values of A.
c LDV: INTEGER. Leading dimension of the array V. LDV >= N.
c TOLIN: DOUBLE PRECISION. Desired relative accuracy of computed singular
c values. The error of SIGMA(I) is approximately
c MAX( 16*EPS*SIGMA(1), TOLIN*SIGMA(I) )
c WORK(LWORK): DOUBLE PRECISION array. Workspace of dimension LWORK.
c LWORK: INTEGER. Dimension of WORK.
c If JOBU.EQ.'N' and JOBV.EQ.'N' then LWORK should be at least
c M + N + 9*KMAX + 2*KMAX**2 + 4 + MAX(M+N,4*KMAX+4).
c If JOBU.EQ.'Y' or JOBV.EQ.'Y' then LWORK should be at least
c M + N + 9*KMAX + 5*KMAX**2 + 4 +
c MAX(3*KMAX**2+4*KMAX+4, NB*MAX(M,N)), where NB>1 is a block
c size, which determines how large a fraction of the work in
c setting up the singular vectors is done using fast BLAS-3
c operation.
c IWORK: INTEGER array. Integer workspace of dimension LIWORK.
c LIWORK: INTEGER. Dimension of IWORK. Should be at least 8*KMAX if
c JOBU.EQ.'Y' or JOBV.EQ.'Y' and at least 2*KMAX+1 otherwise.
c DOPTION: DOUBLE PRECISION array. Parameters for LANBPRO.
c doption(1) = delta. Level of orthogonality to maintain among
c Lanczos vectors.
c doption(2) = eta. During reorthogonalization, all vectors with
c with components larger than eta along the latest Lanczos vector
c will be purged.
c doption(3) = anorm. Estimate of || A ||.
c IOPTION: INTEGER array. Parameters for LANBPRO.
c ioption(1) = CGS. If CGS.EQ.1 then reorthogonalization is done
c using iterated classical GRAM-SCHMIDT. IF CGS.EQ.0 then
c reorthogonalization is done using iterated modified Gram-Schmidt.
c ioption(2) = ELR. If ELR.EQ.1 then extended local orthogonality is
c enforced among u_{k}, u_{k+1} and v_{k} and v_{k+1} respectively.
c INFO: INTEGER.
c INFO = 0 : The K largest singular triplets were computed succesfully
c INFO = J>0, J<K: An invariant subspace of dimension J was found.
c INFO = -1 : K singular triplets did not converge within KMAX
c iterations.
c DPARM: DOUBLE PRECISION array. Array used for passing data to the APROD
c function.
c IPARM: INTEGER array. Array used for passing data to the APROD
c function.
c
c (C) Rasmus Munk Larsen, Stanford, 1999, 2004
c
在 Fortran 中,要記住的重要一點是所有參數都通過引用傳遞,非稀疏 arrays 以列優先格式存儲。 因此,在 C++ 中正確聲明此 function 應如下(未經測試):
extern "C"
void dlansvd(const char *jobu,
const char *jobv,
int *m,
int *n,
int *k,
int *kmax,
void (*aprod)(const char *transa,
int *m,
int *n,
int *iparm,
double *x,
double *y,
double *dparm),
double *U,
int *ldu,
double *Sigma,
double *bnd,
double *V,
int *ldv,
double *tolin,
double *work,
int *lwork,
int *iwork,
int *liwork,
double *doption,
int *ioption,
int *info,
double *dparm,
int *iparm);
真是一頭野獸。 祝你好運!
查看 Tim Davis 的稀疏線性代數軟件可能值得: http://www.cise.ufl.edu/~davis/
一般來說,我發現他的軟件非常有用,通常非常高效和強大。
似乎他一直在和一個學生一起研究稀疏的 SVD package,但我不確定該項目處於什么階段。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.