2013-11-25 3 views
0

다음과 같이하고 싶습니다. 3x1 행렬에 3x3 행렬을 곱합니다. 내 1 차원 배열을 2 차원으로 변환하려고합니다. 그리고 나는 이것이 괜찮다고 생각하지만, 나중에 곱셈을하면 에러가 난다. 하지만 왜 그런지 모르겠습니다. 여기 내 코드가있다.C++ 행렬 곱셈 다른 차원

// 20 -20 0   150 
    //-20 40 -20 x  0 
    // 0 -20 30   400 
    int n = 3; 
double *tab_P = new double [n]; 

tab_P[0] = 150; 
tab_P[1] = 0; 
tab_P[2] = 400; 


double **tab_H; 
tab_H = new double* [n]; 
for(int i=0; i<n; i++) 
    tab_H[i] = new double[n]; 

tab_H[0][0] = 0.2; 
tab_H[0][1] = 0.15; 
tab_H[0][2] = 0.1; 


tab_H[1][0] = 0.15; 
tab_H[1][1] = 0.15; 
tab_H[1][2] = 0.1; 

tab_H[2][0] = 0.1; 
tab_H[2][1] = 0.1; 
tab_H[2][2] = 0.1; 

double **tmp_P; 
tmp_P = new double *[n]; 
for(int i=0; i<n; i++) 
    tmp_P[i] = new double [1]; 

for(int i=0; i<n; i++){ 
    for(int j=0; j<1; j++) { 
     tmp_P[i][j] = tab_P[i]; 
    } 
} 

double **result = new double * [n]; 
for(int i=0; i<n; i++) 
    result[i] = new double [1]; 


int i,j,k; 
int s = 0; 
for(i=0; i<n; i++) { 
    for(j=0; j<1; j++) { 
     s = 0; 
     for(k =0; k<n; k++) 
      s += tab_H[i][k] * tmp_P[k][j]; 
     result[i][j]; 
    } 
} 
+0

* tab_P에 대한 메모리는 어디에서 할당 했습니까? 그리고 다시 무엇이 오류인지, 곱셈 결과입니까? 또는 1D 배열? – theAlias

+0

@theAlias ​​그는 정상에서 바로 그 역할을했습니다. 단지 1 차원 배열입니다. – cmaster

+0

끝에 루프의 어딘가에 오류가 발생합니다. 액세스 위반 읽기 위치 .... 나는 루프의 인덱스에 문제가 있다고 생각하지만 어디에서 볼 수없는 것입니다. – Madbrush

답변

0

게시 한 코드에는 메모리 오류가 없습니다 (나는 valgrind를 사용하여 매우 중요한 도구 인 체크 아웃했습니다). 그래서, 어쨌든 당신은 게시 한 코드에 오류를 복사하지 않았습니다. 게시 한 내용과 원래 코드 사이의 문자 비교를 할 때 오류를 발견해야합니다.

그러나 코드에 논리적 인 버그가 있습니다. sint을 사용합니다.이 값을 사용하여 중간 제품을 합산합니다. s에 값을 할당 할 때마다 부동 소수점 곱은 정수로 반올림됩니다. 이로 인해 잘못된 결과가 발생할 수 있습니다. 변수 sdouble을 사용하십시오.