void matrix_inverse(Gmatrix *current,Gmatrix *inverse) /******************************************************************************* LAST MODIFIED : 4 November 1994 DESCRIPTION : Returns the inverse of current in inverse. ==============================================================================*/ { GMATRIX_PRECISION determinant; ENTER(matrix_I); /* GMH hack to get 2d inverse working */ /* check for 2d */ if((current->data[2][2]==1.0)&& (current->data[0][2]==0.0)&&(current->data[2][0]==0.0)&& (current->data[1][2]==0.0)&&(current->data[2][1]==0.0)) { /* 2d matrix */ matrix_I(inverse); determinant = current->data[0][0]*current->data[1][1]- current->data[1][0]*current->data[0][1]; inverse->data[0][0] = current->data[1][1]/determinant; inverse->data[1][1] = current->data[0][0]/determinant; inverse->data[1][0] = -current->data[1][0]/determinant; inverse->data[0][1] = -current->data[0][1]/determinant; } else { printf("???TEMP matrix_inverse is not implemented yet!"); } LEAVE; } /* matrix_inverse */
void matrix_rotate(Gmatrix *current,double angle,char axis) /******************************************************************************* LAST MODIFIED : 4 November 1995 DESCRIPTION : Rotates in a right hand sense about the axis. ==============================================================================*/ { double cos_angle,sin_angle,new_angle; Gmatrix temp; ENTER(matrix_rotate); new_angle = angle*PI_180; sin_angle = sin(new_angle); cos_angle = cos(new_angle); matrix_I(&temp); switch (axis) { case 'x': case 'X': { temp.data[1][1] = cos_angle; temp.data[2][2] = cos_angle; temp.data[2][1] = sin_angle; temp.data[1][2] = -sin_angle; }; break; case 'y': case 'Y': { temp.data[0][0] = cos_angle; temp.data[2][2] = cos_angle; temp.data[2][0] = -sin_angle; temp.data[0][2] = sin_angle; }; break; case 'z': case 'Z': { temp.data[0][0] = cos_angle; temp.data[1][1] = cos_angle; temp.data[1][0] = sin_angle; temp.data[0][1] = -sin_angle; }; break; }; matrix_premult(current,&temp); LEAVE; } /* matrix_rotate */
int main(int argc, char **argv) { int n; double **pFile, **e, **s; if (argc == 1) { printf("Please enter the file name which contain Matrix data!\n\nUsage: %s <filename>\n", argv[0]); exit(EXIT_FAILURE); } pFile = readMatrix(argv[1], &n, 1); #ifdef DEBUG output_A(pFile, n, n); #endif e = eliminate((const double **)pFile, n, n+1); if (!e) exit(EXIT_FAILURE); printf("RESULT...\n"); output_A(e, n, n+1); s = solve(e, n); printf("方程的解为:\n"); output_A(s, 1, n); // 求逆阵 double **T = readMatrix("gauss_inverse", &n, 0); double **M_I = matrix_I(n); output_A(T, n, n); #ifdef DEBUG_INVERSE printf("输出单位矩阵:\n"); output_A(M_I, n, n); #endif double **II = invers(T, M_I, n); revers(II, n, n); printf("输出逆阵:\n"); output_A(II, n, n); printf("测试:\n"); output_A(multi(T, II, n), n, n); return 0; }