2012-09-26 73 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