- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我用 C++ 编写了一个例程,使用高斯-赛德尔方法求解方程组 Ax = b。但是,我想将此代码用于稀疏的特定“A”矩阵(大多数元素为零)。这样,该求解器花费的大部分时间都忙于将一些元素乘以零。
例如,对于以下方程组:
| 4 -1 0 0 0 | | x1 | | b1 |
|-1 4 -1 0 0 | | x2 | | b2 |
| 0 -1 4 -1 0 | | x3 | = | b3 |
| 0 0 -1 4 -1 | | x4 | | b4 |
| 0 0 0 -1 4 | | x5 | | b5 |
使用Gauss-Seidel方法,我们将得到x1的以下迭代公式:
x1 = [b1 - (-1 * x2 + 0 * x3 + 0 * x4 + 0 * x5)]/4
如您所见,求解器通过乘以零元素来浪费时间。由于我使用大矩阵(例如 10^5 x 10^5),这会对总 CPU 时间产生负面影响。我想知道是否有一种方法可以优化求解器,使其忽略与零元素乘法相关的那些计算部分。
请注意,上例中“A”矩阵的形式是任意的,求解器必须能够处理任何“A”矩阵。
代码如下:
void GaussSeidel(double **A, double *b, double *x, int arraySize)
{
const double tol = 0.001 * arraySize;
double error = tol + 1;
for (int i = 1; i <= arraySize; ++i)
x[i] = 0;
double *xOld;
xOld = new double [arraySize];
for (int i = 1; i <= arraySize; ++i)
xOld[i] = 101;
while (abs(error) > tol)
{
for (int i = 1; i <= arraySize; ++i)
{
sum = 0;
for (int j = 1; j <= arraySize; ++j)
{
if (j == i)
continue;
sum = sum + A[i][j] * x[j];
}
x[i] = 1 / A[i][i] * (b[i] - sum);
}
//cout << endl << "Answers:" << endl << endl;
error = errorCalc(xOld, x, arraySize);
for (int i = 1; i <= arraySize; ++i)
xOld[i] = x[i];
cout << "Solution converged!" << endl << endl;
}
最佳答案
编写稀疏线性系统求解器很困难。 非常难。
我只会选择一个现有的实现。任何合理的 LP 求解器内部都有一个稀疏线性系统求解器,参见示例 lp_solve , GLPK等
如果您可以接受许可证,我推荐 Harwell Subroutine library .尽管连接 C++ 和 Fortran 并不有趣...
关于c++ - 如何在 C++ 中针对稀疏矩阵优化 Gauss-Seidel 例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15665276/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!