2012-09-26 72 views
4

任何人都可以请给我一个简单的例子,说明如何使用CHOLMOD将元素添加到三元组矩阵。如何使用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 documentation找到解决方案,但我没有发现任何帮助。

+1

你是什么意思,说它不会将元素添加到矩阵? k初始化在哪里?这是一个全局变量吗? – angainor

+0

如果我例如通过 cholmod_print_triplet(A打印的矩阵元素,“三联体”,&com); 它打印零矩阵。 的矩阵和变量k的一类的范围来限定,但是,为了简单起见假设它们是全局变量 – asny

回答

8

cholmod_allocate_triplet()A->nzmax,在你的情况下是202 * 202。这只是定义了可用于添加三元组的空间。矩阵中三元组的实际数量为A->nnz,它被cholmod_allocate_triplet()设置为零。请使用A->nnz代替变量k

Tim Davis(CHOLMOD作者)

+1

这么简单,但很难弄清楚,非常感谢! – asny