wikipedia에서 찾은 의사 코드를 따라 Jacobi 반복을 계산하려고합니다. gdb를 통해 코드를 실행했으며, 곱셈 된 행렬과 벡터의 합을 계산할 때마다 힙 버퍼 오버 플로우가 발생합니다. , 내가 어떻게 확실히 모르겠습니다 때문에 내가 k
부분을 제외하고는 의사를 따랐다 생각, 대답 7.1111, -3.2222을 받아야 위키에 따르면C++ 행렬 및 벡터 곱셈 합계에 저장할 때의 Seg 오류
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;
}
: 여기
내 코드입니다 이를 벡터로 구현합니다.세그멘테이션 오류의 원인은 무엇입니까? 내 벡터 또는 매트릭스에서 한계를 벗어나나요? 그것이 내가 세그 폴딩이라고 생각하게하지만, 여기서 무슨 일이 일어나고 있는지 정확히 알지 못합니다. 어떤 도움을 많이 주시면 감사하겠습니다.
감사
편집 : 나는 명확히해야, 그래,이 구현 벡터의 벡터를 가지고 끔찍한 방법입니다. 이것은 위키피디아에서 가지고있는 것을 복제 할 수 있는지 테스트하는 것입니다. 이 대답을 얻을 수 있으면 불필요한 A [0] [0] ... 등을 제거합니다. 나에게 숫자를 생성 할 난수 함수가있다. 그러나 이것이 올바르게 작동하는지 확인하는 것입니다.
사람들이 투표를하지 않는 이유에 대한 설명이 감사하겠습니다. 배열의 C/C++ 인덱싱에서 – Sailanarmo
은'0'부터 시작합니다. –
@SemyonBurov, for 루프를 변경하려고했습니다. int i = 0; i
Sailanarmo