矩阵算法描述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

矩阵乘法:

设C=A*B;

A的列数(A.n)必须等于B的行数(B.m);

C的列数=B的列数,C的行数=A的行数;

C[i][j]为A的第i行与B的第j列乘积累加;

具体实现:

for(i=0;i

for(j=0;j

for(k=0;k

C[i][j] += A[i][k] * B[k][j];

}}}

代码:

int multMatrix(matrix dat,matrix *res)//矩阵左乘

{

matrix mul;

int i,j,k;

input_matrix(&mul);

if(dat.n!=mul.m){

printf("所输入矩阵列数必须等于第一个矩阵的行数\n");

return 0;

}

res->m = dat.m;

res->n = mul.n;

for(i=0; i

for(j=0; j

res->array[i][j] = 0;//因为指针指向了一个奇怪的数值

for(k=0; k

res->array[i][j] += dat.array[i][k] * mul.array[k][j];

}

}

}

return 1;

}

矩阵求逆:

必须为方阵;

对于k从0到n-1作如下几步,n为方阵维数;

1.从第k行,第k列,开始的右下角子阵中选取绝对值最大的元素a[r][c],并记住此元素所在的行号和列号,分别以一维数组is[n],与js[n]保存, 设r为绝对值最大的行号,c为绝对值最大的列号,is[k]=r , js[k]=c, 如果a[k][k]的右下角矩阵全为0,则该矩阵无法求逆;

再通过行交换与列交换将它交换到主元素位置上.这一步称全选主元;

a[k][j]<->a[r][j]; j =0,1,2…n-1; r != k;

a[i][k]<->a[i][c]; i =0,1,2…n-1; c != k;

2.a[k][k] = 1/a[k][k]

3.a[k][j] = a[k][j]*a[k][k], j=0,1,...n-1; i,j!=k

4.a[i][j]=a[i][j]-a[i][k]*a[k][j], i,j=0,1,...,n-1; i,j!=k

5.a[i][k]=-a[i][k]*a[k][k], i=0,1,...,n-1; i!=k;

对于k从n-1到0作恢复,原则如下

在全选主元过程中,先交换的行,列后进行恢复;原来的行(列)交换用列(行)交换来恢复;

a[k][j]<->a[c][j];a[i][k]<->a[i][r]; i , j =0,1,2…n-1; c , r != k;

代码:

int inv(matrix dat,matrix *res)

{

int is[MAX];//记录绝对值最大的行号

int js[MAX];//记录绝对值最大的列号

int i,j,k;

double d,p;

if(dat.m!=dat.n){

printf("行数与列数不相等");

return 0;

}else{

//*res = dat;

for(k=0 ; k

{

d = 0.0;

for(i = k; i < dat.m ;i++)

{

for(j = k; j < dat.n ;j++)

{

p = fabs(dat.array[i][j]);//找出a[k][k]右下角绝对值最大的元素

if(p>d)

{

d = p;is[k]=i;js[k]=j;//记录绝对值最大的元素行号和列号,设为a[r][c]

}

}

}

if(d+1.0 == 1.0)//失败

{

printf("error");

return 0;

}

//通过行交换与列交换将它交换到主元素位置上

if(is[k]!=k)//如果绝对值最大的元素正好在k行上,就不用交换了

{

for(j=0; ja[r][j]

{

p = dat.array[k][j];

dat.array[k][j] = dat.array[is[k]][j];

dat.array[is[k]][j] = p;

}

}

if(js[k]!=k)//如果绝对值最大的元素正好在k列上,就不用交换了

{

for(i=0; ia[i][c]

{

p = dat.array[i][k];

dat.array[i][k] = dat.array[i][js[k]];

dat.array[i][js[k]] = p;

}

}

dat.array[k][k] = 1/dat.array[k][k];//a[k][k] = 1/a[k][k]

for(j=0; j

{

if(j!=k)//a[k][k]不要改

{

dat.array[k][j] = dat.array[k][j]*dat.array[k][k];

}

}

for(i=0; i

{

if(i!=k)

for(j=0 ; j

if(j!=k)

{

dat.array[i][j] = dat.array[i][j]-dat.array[i][k]*dat.array[k][j];

}

}

for(i=0 ; i

{

if(i!=k)

{

dat.array[i][k] = -dat.array[i][k]*dat.array[k][k];

}

}

}

for(k=dat.n-1;k>=0;k--)

相关文档
最新文档