У меня есть следующий код для алгоритма обратной замены:
#include <boost\numeric\ublas\matrix.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), то компилятор скажет вам это.
Других решений пока нет …