//mat:s—ρ //inv:mat‚Μ‹ts—ρ //n :ŽŸŒ³ void inverse(double** mat, double** inv, int n){ int i, j, k; for( i = 0; i < n; i++ ){ for( j = i+1; j < n; j++ ){ mat[j][i] /= mat[i][i]; for( k = i + 1; k < n; k++ ){ mat[j][k] -= mat[i][k] * mat[j][i]; } } } /* ‹ts—ρ‚π‹‚ί‚ι */ for( k = 0; k < n; k++ ){ /* ‰Šϊ‰» */ for( i = 0; i < n; i++ ){ if( i == k ){ inv[i][k] = 1; } else{ inv[i][k] = 0; } } /* ‰π‚π‹‚ί‚ι */ for( i = 0; i < n; i++ ){ for( j = i + 1; j < n; j++ ){ inv[j][k] -= inv[i][k] * mat[j][i]; } } for( i = n-1; i >= 0; i-- ){ for( j = i+1; j < n; j++ ){ inv[i][k] -= mat[i][j] * inv[j][k]; } inv[i][k] /= mat[i][i]; } } }