2017-03-31 6 views
-1

3 행렬이있는 내 과제에 문제가 있습니다. 나는 첫 번째 (a)를 두 번째 (b)로 곱해야하고 결과는 세 번째 (c)로 반환해야합니다. 포인터로만 움직일 수 있다는 것을 말할 가치가 있습니다. 루프에서 인덱스를 사용할 수 없습니다.C++에서 다른 행렬에 행렬 곱하기

주요 문제는 dim1 == dim이고 행렬이 정사각형이 아닌 경우입니다. 모두 C++로 작성해야합니다. 내 코드는 거의 좋은 결과를 반환하지만 첫 번째 행에서 쓰레기 값을 전달하는 것처럼 보입니다. 내가 값으로 채우지 않는 것 같습니다. 나는 어떤 도움을 주셔서 감사합니다. 감사합니다

void multiply(int* a[], int* b[], int* c[], int dim1, int dim2, int 
     dim3){ 

    for(int i = 0; i < dim1; i++){ 
     for(int j = 0; j < dim3; j++){ 
      for(int k = 0; k < dim2; k++){ 
       *(*(c+i)+j) += *(*(a+i)+k) * *(*(b+k)+j); 
      } 
     } 
    } 

    for(int i = 0; i < dim1; i++){ 
     for(int j = 0; j < dim3; j++){ 
      cout << *(*(c+i)+j) << "\t"; 
     } 
     cout << endl; 
    } 
} 

int main(){ 
    const int dim1 = 3; 
    const int dim2 = 2; 
    const int dim3 = 3; 


    int a[dim1][dim2] = {{1,2},{3,4},{5,6}}; 
    int b[dim2][dim3] = {{1,2,3},{4,5,6}}; 
    int c[dim1][dim3] = {}; 

    int *tab1 [dim1]; 
    int *tab2 [dim2]; 
    int *tab3 [dim3]; 


    for(int i = 0; i < dim1; i++){ 
     *(tab1+i) = *(a+i); 
     *(tab2+i) = *(b+i); 
     *(tab3+i) = *(c+i); 
    } 

    multiply(tab1,tab2,tab3,dim1,dim2,dim3); 
}                   
+1

'k' 루프 전에'* (* (c + i) + j) = 0'을 설정해야합니다. – LutzL

답변

0

초기화는 tab 초기화를 제외하고 모두 정확합니다. 반복기는 dim1=3이지만 tab2dim2=2 크기입니다. 이것을 시도하십시오 :

const int dim1 = 3; 
const int dim2 = 2; 
const int dim3 = 3; 

void multiply(int a[dim1][dim2], int b[dim2][dim3], int c[dim1][dim3], int dim1, int dim2, int 
     dim3){ 

    for(int i = 0; i < dim1; i++){ 
     for(int j = 0; j < dim3; j++){ 
      for(int k = 0; k < dim2; k++){ 
       *(*(c+i)+j) += *(*(a+i)+k) * *(*(b+k)+j); 
      } 
     } 
    } 

    for(int i = 0; i < dim1; i++){ 
     for(int j = 0; j < dim3; j++){ 
      cout << *(*(c+i)+j) << "\t"; 
     } 
     cout << endl; 
    } 
} 

int main() 
{ 
    int a[dim1][dim2] = {{1,2},{3,4},{5,6}}; 
    int b[dim2][dim3] = {{1,2,3},{4,5,6}}; 
    int c[dim1][dim3] = {}; 

    multiply(a,b,c,dim1,dim2,dim3); 
}