5

CHOLMODを使用してトリプレット行列に要素を追加する方法の簡単な例を教えてください。

私はこのようなことを試しました:

cholmod_triplet *A;
int k;

void add_A_entry(int r, int c, double x)
{
    ((int*)A->i)[k] = r;
    ((int*)A->j)[k] = c;
    ((double*)A->x)[k] = x;
    k++;
}

int main()
{
    k = 0;
    cholmod_common com;
    cholmod_start(&com);

    A = cholmod_allocate_triplet(202, 202, 202*202, -1, CHOLMOD_REAL, &com);
    add_A_entry(2, 2, 1.);
    add_A_entry(4, 1, 2.);
    add_A_entry(2, 10, -1.);

    cholmod_print_triplet(A, "A", &com);

    cholmod_finish(&com);
    return 0;
}

ただし、これによってマトリックスに要素が追加されることはありません。私は単に出力を取得します:

CHOLMOD triplet: A:  202-by-202, nz 0, lower.  OK

もちろん、私は検索とCHOLMODドキュメントの両方で解決策を見つけようとしましたが、助けは見つかりませんでした。

4

1 に答える 1

9

cholmod_allocate_triplet()あなたの場合はA->nzmax202 * 202です。これは、トリプレットを追加するために使用できるスペースを定義するだけです。行列内のトリプレットの実際の数は でありA->nnz、 によってゼロに設定されますcholmod_allocate_triplet()

variableのA->nnz代わりに を使用する必要がありますk

Tim Davis (CHOLMOD 作者)

于 2012-10-08T16:08:29.187 に答える