当试图将C++矩阵和向量乘法Seg存储到求和中时,它们会出错



我正试图通过遵循我在维基百科上找到的伪代码来计算Jacobi迭代。我已经通过gdb运行了我的代码,我发现每当我试图计算矩阵和向量相乘的总和时,我都会出现堆缓冲区溢出。

这是我的代码:

std::vector<double> sol(std::vector<double> &x,std::vector<std::vector<double> > &A, std::vector<double> &b, int n)
{
double sum; 
int counter = n;
while(counter != 0)
{
for (int i = 1; i <= n; ++i)
{
sum = 0.0;
for (int j = 1; j <= n; ++j)
{
if(j != i)
{
sum += A[i][j]*x[j]; //Issue seems to be here in GDB
std::cout << "Sum " << sum << std::endl;
}
}
x[i] = (1.0/A[i][i])*(b[i]-sum);
for(auto&& e : x)
{
std::cout << e << " ";
}
std::cout << std::endl;
}
counter--;
}
return x;
}

int main()
{
//const int SIZE = 1000;
const int SIZE = 2;
double ranNumber = 0.0;
std::vector<std::vector<double> > A;
std::vector<double> testX = {1.0,1.0}; 
std::vector<double> testB = {11.0,13.0};

for (int i = 0; i < SIZE; ++i)
{
std::vector<double> k;
for(int j = 0; j < SIZE; ++j)
{
ranNumber = randNumber();
k.emplace_back(ranNumber);
}
A.emplace_back(k);
}
A[0][0] = 2.0;
A[0][1] = 1.0;
A[1][0] = 5.0;
A[1][1] = 7.0;
std::vector<double> xSol = sol(testX,A,testB,30);
for(auto &&e:xSol)
{
std::cout << e << " ";
}
std::cout << std::endl;
return 0;
}

根据wiki,我应该会收到答案7.1111,-3.2222,我想除了k部分之外,我已经遵循了伪代码,因为我不太确定如何将其实现为向量。

是什么导致了分段错误?我的向量或矩阵是越界了吗?这就是为什么我认为我错了,但我不确定这里到底发生了什么。任何帮助都将不胜感激。

感谢

编辑:我应该澄清一下,是的,这是一种可怕的方式来实现一个向量中的向量。这只是一个测试,看看我是否能复制他们在维基百科上的内容。如果我能得到这个答案,我会删除不必要的A[0][0]。。。等等。我有一个随机数函数,它会为我生成数字。但这只是为了确保它正确工作。

首先,索引问题是从0到n-1,而不是从1到n

然后,主要构造向量A为2x2,但通过A[i][j],j迭代,直到30。所以你访问数组是越界的!使用SIZE调用函数,因为您是基于SIZE构造矩阵的。

最后,在没有首先确保它不是被零除的情况下,用A[i][i]除。(好吧,不是,但你应该作为一种反射来验证)。

我不知道你是否会得到正确的答案,但你不应该再经历短暂的沮丧。

相关内容

  • 没有找到相关文章

最新更新