我需要一个在C ++程序中执行LU分解(分解,有什么区别?)的函数或类。我正在使用编译器Dev-c最新版本(在Windows上)。我想到了如何安装犰狳和lapack,但它似乎非常复杂,并且有一些问题http://icl.cs.utk.edu/lapack-for-windows/lapack/(正如页面底部的说法)。所以我想要一个运行良好的库(在C ++中)并且安装起来并不复杂。我在例子中发现了一些关于Eigen的东西,它是怎么回事?还有其他建议吗?
三江源
P.S。矩阵在对角线上和附近密集,其余部分稀疏,角度附近的部分(N-E)为空。
答案 0 :(得分:0)
我为你写了一些C代码。也许它可以帮助。这是一个将密集矩阵分解为L,U的过程,其中L * U = A,L - 下三角,U - 上三角,L [i,i] = U [i,i](对角元素相等) 。这种分解也称为LU(sq)。
#include <math.h>
// A, L, U each allocates at least N*N doubles
// A contains elements of given matrix, written row by row
void decompose(unsigned N, double *A, double *L, double *U) {
#define _(M,i,j) M[N*i + j]
#define _A(i,j) _(A,i,j)
#define _L(i,j) _(L,i,j)
#define _U(i,j) _(U,i,j)
_L(0,0) = sqrt(_A(0,0));
_U(0,0) = sqrt(_A(0,0));
for ( int i = 0; i < N; ++i ) {
_L(i,0) = _A(i,0) / _A(0,0);
_U(0,i) = _A(0,i) / _A(0,0);
_L(0,i) = _U(i,0) = 0.0;
double s = 0.0;
for ( int k = 0; k < i; ++k ) {
s += _L(i,k) * _U(k,i);
}
_L(i,i) = _U(i,i) = sqrt(_A(i,i) - s);
for ( int j = 1; j < i; ++j ) {
double s = 0.0;
for ( int k = 0; k < j; ++k ) {
s += _L(i,k) * _U(k,j);
}
_L(i,j) = (_A(i,j) - s) / _L(i,i);
_L(j,i) = 0.0;
double s = 0.0;
for ( int k = 0; k < i; ++k ) {
s += _L(i,k) * _U(k,j);
}
_U(j,i) = (_A(i,j) - s) / _U(i,i);
_U(i,j) = 0.0;
}
}
}
不幸的是,我现在没有时间检查代码是否有错误。 我有一些我有信心的公式(几年前用过):
我的代码基于这些公式。 当然,如果你想使用一些特定的适合你的数据稀疏格式,你需要改变程序,而不是公式。