2012-09-26 3 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는 어디에 초기화됩니까? 그것은 글로벌 변수입니까? I는 예컨대 cholmod_print_triplet (A하여 행렬 요소를 인쇄하는 경우 – angainor

+0

는 "삼중"&com); 그것은 편의상 매트릭스. 제로의 행렬을 출력하고, 변수 k는 클래스의 범위에 정의되어 있지만, 예 글로벌 변수라고 가정 해 보겠습니다. – asny

답변

8

cholmod_allocate_triplet()A->nzmax (귀하의 경우 202 * 202) 그것은 단지 삼중 항을 추가 할 수있는 공간을 정의합니다. 행렬의 실제 삼중 항의 수는 A->nnz이며 cholmod_allocate_triplet()에 의해 0으로 설정됩니다.

변수 k 대신 A->nnz을 사용해야합니다.

팀 데이비스 (CHOLMOD의 저자)

+1

간단하지만 아직 알아 내기가 어렵습니다. 감사합니다. – asny

관련 문제