先讲一个最基本的矩阵变换函数以后的各种变换都要用到: /*由于元素为double类型故当与0或1比较式应当近似比较:*/ #define N 0.000001 #define Ng (N + 1) #define Nl (1 - N) lbian change_data(data *D ) { lbian count; lbian i,j,k,l; lbian hang,lie; datatype temp; datatype num; hang = D -> hang; lie = D -> lie; count = 0; for(i = 1; i < lie ;i ++) { /*从1到lie-1列扫描 */ for(j = i+1;j <= hang ;j ++) { /*第i列则从第i+1行开始变换使第i行以下的全变为零*/ if( ((D->top)[j][i] < N) && ((D->top)[j][i] > -N)) /*遇到top[i][j]是0则不用变换*/ continue; for( k = i ;k <= hang ;k ++) { if(((D->top)[k][i] > N) || ((D->top)[k][i] < -N)) break; } /*在第i列开始(包括第i列)找到第一个非0的元素*/ if( k != i && k <= hang ) { for( l=1 ; l <= lie ; l ++) { num = (D -> top)[i][l]; (D -> top)[i][l] = (D -> top)[k][l]; (D -> top)[k][l] = num; } count ++; /*找到一个第k行第i列(k != i)非零 则交换第k行和第i行并 count ++*/ } if( k > hang ) /*说明第i列的从第i+1行到最末行已经全是0*/ continue; temp = -(datatype)(D -> top)[j][i] / (D -> top)[i][i]; for( k = 1;k <= lie ;k ++) (D -> top)[j][k] += (datatype)(temp* (D -> top)[i][k]); /*将第j行加上temp与第i行的乘积可使top[j][i]为0*/ } } return count; /*共进行了count次交换行变换*/ } /*这个算法比较复杂(奉劝未学过线性代数的不要看)根据行列式的上三角变换原则进行变换的, 对于矩阵也可以变换: 将一个矩阵尽可能使“主对角线”以下为零(对于一个有hang行,lie列的矩阵设min = hang < lie ? hang :lie ; 则这个算法可以将top[1][1]到top[min][min]这个矩阵变为上三角形矩阵,例如: -------------------------------------------------------------------------------------------- 4 5 6 变为: 4 5 6 1 2 3 0 0.75 1.5 -------------------------------------------------------------------------------------------- 1 2 变为: 1 2 3 4 0 -2 5 6 0 -4 -------------------------------------------------------------------------------------------- 3 2 0 5 0 3 -2 3 6 -1 2 0 1 5 -3 1 6 -4 -1 4 变为: 3 2 0 5 0 0 -4 3 1 -1 0 0 0 4/3 -8/3 0 0 0 -4/3 8/3 -------------------------------------------------------------------------------------------*/ 以下的三个函数都必须为目的矩阵申请好内存: /*------------------------------两矩阵和或差,A和B的和放在c中-------------------------------- --------------------------------如果flag>0则求和否则求差-----------------------------------*/ /*------------------------------两矩阵和 ,A和B的和放在c中-----------------------------------------*/ int32 data_plus(data *C,data *A,data *B,int8 flag) { lbian i,j; if((A->hang != B->hang) || (A->lie!=B->lie)) { printf("条件不符不能求和! /n"); return 0; } for(i=1 ; i<=A->hang; i ++) for(j=1 ; j <= A->lie;j ++) { if(flag>0) (C->top)[i][j] = (A->top)[i][j] + (B->top)[i][j]; else (C->top)[i][j] = (A->top)[i][j] - (B->top)[i][j]; } return 1; } /*------------------------------两矩阵积 ,A和B的乘积放在c中-----------------------------------------*/ int data_mul(data *C,data *A,data *B) { lbian i, j , k; if(A->lie!=B->hang){ printf("条件不符不能求积! /n"); return 0; } for ( i =1 ;i <= C -> hang ; i ++ ) for ( j =1 ; j <= C ->lie ; j ++) (C -> top)[i][j] = 0; for(i = 1;i <= A->hang;i ++) for(j = 1;j <= B->lie;j++) for(k=1;k<=A->lie;k++) C -> top [i][j] += (A -> top)[i][k] * (B->top)[k][j]; return 1; } /*----------------------------------拷贝两个矩阵的内容 -------------------------------------------------*/ void data_cpy ( data *des , data *src ) { lbian hang = src ->hang; lbian lie = src ->lie ; lbian i,j; for (i = 1; i <= hang;i ++) for (j = 1; j <= lie; j ++) (des->top)[i][j] = (src->top)[i][j]; }