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). 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 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 } }; printf( "Macierz wynikowa: \n" ); Mnozenie( M1, M2, n, m ); Mnozenie2( M2, M1, n, m ); return 0; }
} |
|
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? |
|
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. 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; } |
|
« 1 » |