2013-07-30 2 views
2

Windows 7 x64에서 Microsoft Visual Studio 2008을 사용하고 있습니다. 나는 A이 양수인 csparse을 사용하여 다음 선형 시스템 Ax=b을 풀려고합니다.csparse : cs_cholsol을 사용하여 간단한 희소 선형 방정식 시스템을 해결합니다.

| 1 0 0 1 | 
A = | 0 3 1 0 | 
    | 0 1 2 1 | 
    | 1 0 1 2 | 

    | 1 | 
b = | 1 | 
    | 1 | 
    | 1 | 

나는 다음과 같은 코드

내가 제대로 스파 스 변수를 만들 었는지 확인하기 위해
int Ncols = 4, Nrows = 4, nnz = 10; 
int cols[] = {0, 3, 1, 2, 1, 2, 3, 0, 2, 3}; 
int rows[] = {0, 0, 1, 1, 2, 2, 2, 3, 3, 3}; 
double vals[] = {1, 1, 3, 1, 1, 2, 1, 1, 1, 2}; 

cs *Operator = cs_spalloc(Ncols,Nrows,nnz,1,1); 

int j; 
for(j = 0; j < nnz; j++) 
{ 
    Operator->i[j] = rows[j]; 
    Operator->p[j] = cols[j]; 
    Operator->x[j] = vals[j]; 
    Operator->nz++; 
} 

for(j = 0; j < nnz; j++) 
    cout << Operator->i[j] << " " << Operator->p[j] << " " << Operator->x[j] << endl; 

Operator = cs_compress(Operator); 

for(j = 0; j < nnz; j++) 
    cout << Operator->i[j] << " " << Operator->p[j] << " " << Operator->x[j] << endl; 

// Right hand side 
double b[] = {1, 1, 1, 1}; 

// Solving Ax = b 
int status = cs_cholsol(0, Operator, &b[0]); // status = 0 means error. 

를 사용하고, 나는 행과 열 인덱스를 인쇄뿐만 아니라 값으로 시도 앞뒤 콘솔 cs_compress. 다음은이 인쇄 결과입니다.

하기 전에 :

0 0 1 
0 3 1 
1 1 3 
1 2 1 
2 1 1 
2 2 2 
2 3 1 
3 0 1 
3 2 1 
3 3 2 

후 : 때문에 cs_compress를 호출 한 후 위의 관찰 할 수있는 쓰레기 값의

0 0 1 
3 2 1 
1 4 3 
2 7 1 
1 10 1 
2 -6076574517017313795 2 
3 -6076574518398440533 1 
0 -76843842582893653 1 
2 0 1 
3 0 2 

, Ax=b의 솔루션은 내가 계산 한 하나와 일치하지 않습니다 MATLAB으로. MATLAB의 결과는 다음과 같습니다.

| 2.0000 | 
x = | 0.0000 | 
    | 1.0000 | 
    |-1.0000 | 

흥미롭게도, 나는 A3×3 행렬이다 Ax=b 해결 다음과 같은 코드,이 문제가 없습니다.

int Ncols = 3, Nrows = 3, nnz = Nrows; 

cs *Operator = cs_spalloc(Ncols,Nrows,nnz,1,1); 
int j; 
for(j = 0; j < nnz; j++) { 
    Operator->i[j] = j; 
    Operator->p[j] = j; 
    Operator->x[j] = 1.0; 
    Operator->nz++; 
} 

Operator = cs_compress(Operator); 

double b[] = {1, 2, 3}; 

int status = cs_cholsol(0, Operator, &b[0]); // status = 1 means no error. 

사람은 제가 cs_compress와 함께이 문제를 해결하는 데 도움을 주시겠습니까?

+0

실제 시스템이 4x4보다 훨씬 커지거나 코드에 대해 배우는 것보다 희소 매트릭스로 시간을 낭비하기를 바랍니다. 문제의 매트릭스는 50 % 이상 (이상적으로) 이상이어야하며 저장 용량을 거의 얻지 못할 경우 성능 저하를 지불해야합니다. – horchler

+0

@horchler : 실제 시스템이 훨씬 큽니다. 방금 코드를 배우고 싶었습니다. – AFP

답변

2

이전에 csparse과 함께 일한 적은 없지만 source code을 건너 뛰었습니다.

Operator을 만들기 위해 cs_spalloc()을 호출하면 마지막 매개 변수를 1으로 설정하여 표시되는 트리플을 만듭니다. 그러나 cs_copmress()을 호출 한 결과 더 이상 결과가 나타나지 않습니다 (결과를 확인하여 Operator->n이 압축 후 -1). 따라서 마치 행렬을 통과하는 것이 오류입니다.

cs_print() API를 사용하여 스파 스 매트릭스를 인쇄 할 수 있습니다.

압축 된 행렬이 새로운 할당이고 원래 압축되지 않은 행렬이 cs_compress()에 의해 해제되지 않았으므로 코드 누락으로 인해 메모리가 누수됩니다.

관련 문제