3

連立一次方程式Ax=Bを解かなければならないタスクがあります。ここで、Aは10000のオーダーのスパース行列です。これを解くためにcsparseを使用しています。私の最初の実装では、デモの目的で、Aは3 * 3次の単位行列であり、B={1,2,3}です。以下はコードスニペットで、ステータスに0が返されます。これは、実装にエラーがあることを意味します。私が間違っているのは何ですか?

    cs A;
    int  N = 3;
    double b[]={1,2,3};
    double data[]={1,1,1};
    int columnIndices[]={0,1,2};
    int rowIndices[]={0,1,2};
    A.nzmax =3;
    A.m = N;
    A.n = N;
    A.p = &columnIndices[0];
    A.i = &rowIndices[0];
    A.x = &data[0];
    A.nz = 3;
    int status =  cs_cholsol(0,&A,&b[0]);
    NSLog(@"status=%d",status);   // status always returns 0, which means error
4

2 に答える 2

2

入力行列をCSCに変換する必要があります。ソルバー関数は行列形式をチェックし、座標形式の場合は0を返します。ところで。同様の例では、「cholsol」を機能させることができませんでしたが、「lsolve」は正常に機能します(CSCへの変換後)。

于 2012-11-07T11:55:45.300 に答える
0

上記のマトリックス A はマトリックス トリプレット形式です。最初に、圧縮された列形式 (B) に変換してから、cs_chsol 関数を適用して結果を取得する必要があります。

// マトリックス トリプレットを列圧縮形式に変換します

cs *B = cs_compress(&A);
int status =  cs_cholsol(0,&B,&b[0]);

私はそれを自分のプログラムに実装しましたが、今ではすべてが完全に正常に動作しています。

于 2012-11-15T13:43:00.930 に答える