先讲一个最基本的矩阵变换函数以后的各种变换都要用到:
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
-------------------------------------------------------------------------------------------*/
以下的三个函数都必须为目的矩阵申请好内存:
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];
}