Mnożenie macierzy

0

Witam! Mam zadanie: wykonać na macierzach działania M1M2 i M2M1. Niestety, choć wyniki są poprawne, funkcja Mnozenie wyświetla mi jedną kolumnę za dużo, a funkcja Mnożenie2 wyświetla jeden wiersz za mało.
Co jest nie tak? Chciałabym też jeszcze wiedzieć jak wypisać wyniki powyższych funkcji używając printfa w mainie(ćwiczeniowiec się czepia).

void Mnozenie( int( * M1 )[ 3 ], int( * M2 )[ 2 ], int n, int m ) {
   
    int i, j, k, tmp, M3[ 2 ][ 2 ];
   
    for( i = 0; i < n; i++ )
    for( j = 0; j < n; j++ )
    {
        tmp = 0;
        for( k = 0; k < m; k++ )
             tmp +=( M1[ i ][ k ] * M2[ k ][ j ] );
       
        M3[ i ][ j ] = tmp;
    }
    printf( "M3 = \n" );
    for( i = 0; i < n; i++ ) {
        for( j = 0; j < m; j++ )
             printf( "%d ", M3[ i ][ j ] );
       
        printf( "\n" );
    }
}
void Mnozenie2( int( * M2 )[ 2 ], int( * M1 )[ 3 ], int n, int m ) {
   
    int i, j, k, tmp, M4[ 3 ][ 3 ];
   
    for( i = 0; i < n; i++ )
    for( j = 0; j < m; j++ )
    {
        tmp = 0;
        for( k = 0; k < n; k++ )
             tmp +=( M2[ i ][ k ] * M1[ k ][ j ] );
       
        M4[ i ][ j ] = tmp;
    }
    printf( "M4 = \n" );
    for( i = 0; i < n; i++ ) {
        for( j = 0; j < m; j++ )
             printf( "%d ", M4[ i ][ j ] );
       
        printf( "\n" );
    }
}

int main( int argc, char ** argv ) {
    //int i,j;
    int n = 2;
    int m = 3;
    int M1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } };
    int M2[ 3 ][ 2 ] = { { 8, 7 }, { 6, 5 }, { 4, 3 } };
    //int M3[2][2], M4[3][3];
   
    printf( "Macierz wynikowa: \n" );
    Mnozenie( M1, M2, n, m );
    // printf("M3 = \n");
    //for (i=0 ;i<n; i++)
    //for(j=0 ;j<m ;j++)
    //printf("%d \n", M3[i][j]);
   
    Mnozenie2( M2, M1, n, m );
   
    return 0;
}
}
0

Sprawdź jakie m i n podajesz do funkcji. Mnożysz macierze które nie są kwadratowe a m i n się u Ciebie nie zmienia przy zamianie kolejności mnożenia.

0

Już do tego doszłam. Problem rozwiązany. Temat do zamknięcia

0

W przypadku nadawania sensownych nazw (konkretnie tu y,x zamiast i,j oraz Y,X zamiast n,m) ten błąd nawet nie mógłby powstać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1