0

C++ のプログラムで LU 因数分解 (分解、違いは何ですか?) を実行する関数またはクラスが必要です。コンパイラとして Dev-c 最新バージョン (Windows 上) を使用しています。armadillo と lapack のインストール方法はわかりましたが、非常に複雑で、少し問題があるようですhttp://icl.cs.utk.edu/lapack-for-windows/lapack/ (ページの下部にあるように) . そのため、うまく機能し、インストールがそれほど複雑ではないライブラリ (C++) が必要です。Eigen についての例を見つけましたが、どうですか? 他の提案はありますか?

ありがとうございました

PS行列は、対角線上およびその近くで密集しており、残りは疎であり、角度(NE)に近い部分は空です。

4

1 に答える 1

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;
        }
    }
}

残念ながら、今はコードのバグをチェックする時間がありません。私が自信を持っている数式がいくつかあります(数年前に使用されました): ここに画像の説明を入力

私のコードはこれらの式に基づいています。確かに、データのスパース形式に適した特定のものを使用したい場合は、手順を変更する必要がありますが、式は変更しないでください。

于 2013-05-29T11:06:22.627 に答える