我有以下代码用于反向替换算法:
#include <boostnumericublasmatrix.hpp>
typedef boost::numeric::ublas::matrix<double> dM;
dM bSub(dM A, dM b)
{
unsigned int n = (int)b.size1();
assert(b.size2() == 1);
assert(n == A.size1());
dM x(n, 1);
for (unsigned i = (n - 1); i >= 0; --i)
{
double sum = 0.0;
for (unsigned j = (n - 1); j > i; --j)
{
sum += A(i, j)*x(j, 0);
}
x(i, 0) = (b(i, 0) - sum) / A(i, i);
}
return x;
}
当我尝试运行它时,会弹出一个错误的索引错误。我不太确定错误在哪里,因为当我手动浏览算法时,我找不到问题。
我还尝试递增嵌套循环:for(unsigned j = 0; j < n; ++j)
.同样,我遇到了同样的错误索引错误。
基于调试器,我认为问题与i
以某种方式取值 4294967295 有关,我不确定该数字可能来自哪里,因为它并不适合我代码的其他部分。
最后,我还编写了一个前向替换算法,使用非常相似的结构,运行没有问题。
有人知道发生了什么吗?
> i>=0
条件对于unsigned
类型的i
始终为真。
如果你在编译时带有警告(-Wall -Wextra -pedantic
在你的GCC/Clang上),那么编译器会告诉你这一点。