2013-07-30 105 views
2

我在Windows 7 x64上使用Microsoft Visual Studio 2008。我試圖通過使用csparse來解決以下線性系統Ax=b,其中A是正定的。使用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 

後:

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 

因爲這可以在上面調用cs_compress後觀察到垃圾桶的值,的Ax=b溶液不匹配,我已計算出的一個用MATLAB。 MATLAB產生以下解決方案。

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

有趣的是,我沒有這個問題如下代碼,其解決Ax=b,其中A3×3單位矩陣。

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

我希望你的實際系統比4 * 4大得多,否則你會用稀疏的矩陣來浪費你的時間 - 除了學習代碼。所討論的矩陣應該大於50%零(理想情況下更高),否則你會因爲幾乎沒有存儲增益而付出性能損失。 – horchler

+0

@horchler:實際系統要大得多。我只是想學習代碼。 – AFP

回答

2

從來沒有與csparse之前,我撇去source code

當您致電cs_spalloc()創建Operator時,您正在創建一個三元組(通過將最後一個參數設置爲1來指示)。但是,在撥打cs_copmress()後,結果不再是三元組(您可以通過檢查結果並在壓縮後看到Operator->n現在爲-1)來檢測此結果。所以,像遍歷矩陣是錯誤的。

您可以使用cs_print() API來打印稀疏矩陣。

順便說一句,你的代碼會泄漏內存,因爲壓縮矩陣是一個新分配,原始未壓縮矩陣未被cs_compress()釋放。