我在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
,其中A
是3×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
?
我希望你的實際系統比4 * 4大得多,否則你會用稀疏的矩陣來浪費你的時間 - 除了學習代碼。所討論的矩陣應該大於50%零(理想情況下更高),否則你會因爲幾乎沒有存儲增益而付出性能損失。 – horchler
@horchler:實際系統要大得多。我只是想學習代碼。 – AFP