矩阵算法描述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; 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; i { 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--)