2017-11-12 14 views
-1

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] ... 등을 제거합니다. 나에게 숫자를 생성 할 난수 함수가있다. 그러나 이것이 올바르게 작동하는지 확인하는 것입니다.

+0

사람들이 투표를하지 않는 이유에 대한 설명이 감사하겠습니다. 배열의 C/C++ 인덱싱에서 – Sailanarmo

+1

은'0'부터 시작합니다. –

+0

@SemyonBurov, for 루프를 변경하려고했습니다. int i = 0; i Sailanarmo

답변

1

먼저 1에서 n 대신 0에서 n-1까지의 색인 생성 문제가 있습니다.

그러면 벡터 A가 2 x 2가되도록 기본으로 구성하지만 A[i][j], j는 30까지 반복합니다. 그래서 범위 밖으로 배열에 액세스합니다! SIZE을 기반으로 행렬을 구성하기 때문에 SIZE을 사용하여 함수를 호출하십시오.

마지막으로 0으로 나누지 않고 A[i][i]으로 나눕니다. (좋아,하지만 당신은 반사의 일종으로 확인해야합니다).

정답을 얻을 지 모르겠지만 더 이상 짧은 덤프가 발생하지 않아야합니다.