void test_matrix (int length) { printf ("\nTesting Square Matrix Of Order %i\n\n", length); double matrix_tmp[length*length]; // First Matrix; // First Matrix int i = 0; // For Loop Variable double k = 1.0; matrix_print(matrix_tmp, length); printf ("\n[*] Adding Numbers:\n"); for ( i = 0; i < length*length; i++) { printf ("[k=%lf] Number[%i] = ", k, i); matrix_tmp[i] = k; printf (" %lf (expected: [%lf])", matrix_tmp[i], k); k = k+1; printf (" OK\n"); printf (" K+1=%lf\n\n\n", k); } for ( i = 0; i < length; i++) { printf ("\nNumber[%i] = %lf", i, matrix_tmp[i]); } printf ("\n[*] Matrix Print:\n\n"); matrix_print(matrix_tmp, length); printf ("\n[*]Determinant Calculation:"); double det1 = matrix_det (matrix_tmp, length); printf (" OK \n"); printf ("Calculated Determinant = %lf\n", det1); }
int main( int argc, char ** argv) { rng_type * rng = rng_alloc( MZRAN , INIT_DEV_RANDOM ); matrix_type * A = matrix_alloc( 12 , 12 ); matrix_type * B = matrix_alloc( 12 , 12 ); matrix_random_init( A , rng ); matrix_assign( B , A ); matrix_pretty_print( A , " A " , "%8.4f" ); #ifdef WITH_LAPACK matrix_inv( B ); printf("\n"); matrix_pretty_print( B , "inv(A)" , "%8.4f" ); matrix_inplace_matmul( B , A ); printf("\n"); matrix_pretty_print( B , " I " , "%8.4f" ); { matrix_type * A3 = matrix_alloc(3,3); matrix_random_init( A3 , rng ); matrix_iset( A3 , 0 , 0 , sin(0.98)); printf("matrix_det3:%g ",matrix_det3( A3 )); printf("matrix_det:%g \n",matrix_det( A3 )); } { matrix_type * A4 = matrix_alloc(4,4); matrix_random_init( A4 , rng ); matrix_iset( A4 , 0 , 0 , sin(0.98)); printf("matrix_det4:%g ",matrix_det4( A4 )); printf("matrix_det:%g \n",matrix_det( A4 )); } #endif matrix_free( A ); matrix_free( B ); rng_free( rng ); }
void test_det3() { matrix_type * m = matrix_alloc(3 , 3 ); rng_type * rng = rng_alloc(MZRAN , INIT_DEV_URANDOM ); matrix_random_init( m , rng ); { double det3 = matrix_det3( m ); double det = matrix_det( m ); test_assert_double_equal( det , det3 ); } matrix_free( m ); rng_free( rng ); }
Matrix matrix_inv(const Matrix& A){ int nrows = A.size(); int ncols = A[0].size(); assert(nrows== 2); assert(ncols == 2); Matrix inv(nrows, std::vector<double>(ncols)); double det = matrix_det(A); inv[0][0] = A[1][1]/det; inv[0][1] = -A[0][1]/det; inv[1][0] = -A[1][0]/det; inv[1][1] = A[0][0]/det; return inv; }
void test_det4() { matrix_type * m = matrix_alloc(4 , 4 ); rng_type * rng = rng_alloc(MZRAN , INIT_DEV_URANDOM ); for (int i=0; i < 10; i++) { matrix_random_init( m , rng ); { double det4 = matrix_det4( m ); double det = matrix_det( m ); test_assert_double_equal( det , det4 ); } } matrix_free( m ); rng_free( rng ); }
// invertieren mit Adjunkter struct mat matrix_invertieren_adjunkte(struct mat matrix_in) { double det; struct mat tmp; tmp.spalten = matrix_in.spalten; tmp.zeilen = matrix_in.zeilen; tmp.matrix = (double *) calloc(tmp.zeilen * tmp.spalten, sizeof(double)); if(tmp.matrix == NULL) alloc_fail(); tmp=matrix_adjunkte(matrix_in); det=matrix_det(matrix_in); if(det > -FLOATNULL && det < FLOATNULL) // Wenn Determinante == 0 { tmp.zeilen = tmp.spalten = 0; return tmp; } det=1/det; return(matrix_skalaprodukt(tmp,det)); }