Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Mnożenie macierzy.

Ostatnio zmodyfikowano 2014-04-01 22:20
Autor Wiadomość
Amakesh
Temat założony przez niniejszego użytkownika
[C] Mnożenie macierzy.
» 2014-03-26 17:21:11
Witam! Mam zadanie: wykonać na macierzach działania M1*M2 i M2*M1. Niestety, choć wyniki są poprawne, funkcja Mnozenie wyświetla mi jeden wiersz 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).

C/C++
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;
}

}
P-107232
Monika90
» 2014-03-26 18:11:45
Chciałabym też jeszcze wiedzieć jak wypisać wyniki powyższych funkcji używając printfa w mainie
W main zadeklarauj tablicę wynikową i do funkcji monożących przekazuj wskaźnik do pierwszego elementu tej tablicy, tak żeby funkcja mogła w niej zapisać wynik.

Radzę też dobierać nazwy zmiennych bardziej starannie. Np. parametry funkcji: n i m, domyślam się, że n to ilość wierszy pierwszej macierzy, a m drugiej, a może odwrotnie?
P-107239
Amakesh
Temat założony przez niniejszego użytkownika
» 2014-04-01 22:20:37
Dlaczego poniższy kod zawsze daje w wyniku same jedynki? Kiedy zamiast macierzy podstawię inną o tych samych wymiarach i liczbach całkowitych, wynik jest poprawny.


C/C++
void obrot( double( * P )[ 3 ], double( * O )[ 3 ], double( * W )[ 3 ] ) {
   
    int i, j, k, tmp, w1, kl;
    w1 = 1;
    kl = 3;
   
   
   
    for( i = 0; i < w1; i++ )
    for( j = 0; j < kl; j++ )
    {
        tmp = 0;
        for( k = 0; k < kl; k++ )
             tmp +=( P[ i ][ k ] * O[ k ][ j ] );
       
        W[ i ][ j ] = tmp;
    }
   
}


int main( void ) {
    double P[ 1 ][ 3 ] = { 3, 2, 1 };
    double sincos =( sqrt( 2 ) / 2 );
    double arcsin =( - sqrt( 2 ) / 2 );
    double s =(( 2 - sqrt( 2 ) ) + sincos );
    double z =(( 1 - sqrt( 2 ) ) - sincos );
    double O[ 3 ][ 3 ] = { { sincos, sincos, 0 }, { arcsin, sincos, 0 }, { s, z, 1 } };
    double W[ 1 ][ 3 ];
    int i, j;
    printf( "sincos: %f \n", sincos );
    printf( "arcsin: %f \n", arcsin );
    printf( "Tab: \n" );
    obrot( P, O, W );
    for( i = 0; i < 1; i++ ) {
        for( j = 0; j < 3; j++ )
       
             printf( "%f ", W[ i ][ j ] );
       
        printf( "\n" );
    }
    return 0;
}
P-107598
« 1 »
  Strona 1 z 1