求逆矩阵的C++程序_第1页
求逆矩阵的C++程序_第2页
求逆矩阵的C++程序_第3页
求逆矩阵的C++程序_第4页
求逆矩阵的C++程序_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*/* 求任何一个矩阵的逆*/*#include #include #include #define N 10 /定义方阵的最大阶数为10/函数的声明部分float MatDet(float *p, int n); /求矩阵的行列式float Creat_M(float *p, int m, int n, int k); /求矩阵元素A(m, n)的代数余之式void print(float *p, int n); /输出矩阵n*nbool Gauss(float AN, float BN, int n); /采用部分主元的高斯消去法求方阵A的逆矩阵Bint main() float *buffer, *p; /定义数组首地址指针变量 int row, num; /定义矩阵的行数和矩阵元素个数 int i, j; float determ; /定义矩阵的行列式 float aNN, bNN; int n; cout 采用逆矩阵的定义法求矩阵的逆矩阵!n; cout row; num = 2 * row * row; buffer = (float *)calloc(num, sizeof(float); /分配内存单元 p = buffer; if (NULL != p) for (i = 0; i row; i+) cout Please input the number of i+1 row: ; for (j = 0; j *p+; else cout Cant distribute memoryn; cout The original matrix : n; print(buffer, row); /打印该矩阵 determ = MatDet(buffer, row); /求整个矩阵的行列式 p = buffer + row * row; if (determ != 0) cout The determinant of the matrix is determ endl; for (i = 0; i row; i+) /求逆矩阵 for (j = 0; j row; j+) *(p+j*row+i) = Creat_M(buffer, i, j, row)/determ; cout The inverse matrix is: endl; print(p, row); /打印该矩阵 else cout The determinant is 0, and there is no inverse matrix!n; free(buffer); /释放内存空间 cout 采用部分主元的高斯消去法求方阵的逆矩阵!n; cout n; cout 请输入 n 阶方阵: n; /输入一个n阶方阵 for (i = 0; i n; i+) for (j = 0; j aij; /运用高斯消去法求该矩阵的逆矩阵并输出 if (Gauss(a, b, n) cout 该方阵的逆矩阵为: n; for (i = 0; i n; i+) cout setw(4); for (j = 0; j n; j+) cout bij setw(10); cout endl; return 0;/-/功能: 求矩阵(n*n)的行列式/入口参数: 矩阵的首地址,矩阵的行数/返回值: 矩阵的行列式值/-float MatDet(float *p, int n) int r, c, m; int lop = 0; float result = 0; float mid = 1; if (n != 1) lop = (n = 2) ? 1 : n; /控制求和循环次数,若为2阶,则循环1次,否则为n次 for (m = 0; m lop; m+) mid = 1; /顺序求和, 主对角线元素相乘之和 for (r = 0, c = m; r n; r+, c+) mid = mid * (*(p+r*n+c%n); result += mid; for (m = 0; m lop; m+) mid = 1; /逆序相减, 减去次对角线元素乘积 for (r = 0, c = n-1-m+n; r n; r+, c-) mid = mid * (*(p+r*n+c%n); result -= mid; else result = *p; return result;/-/功能: 求k*k矩阵中元素A(m, n)的代数余之式/入口参数: k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k/返回值: k*k矩阵中元素A(m, n)的代数余之式/-float Creat_M(float *p, int m, int n, int k) int len; int i, j; float mid_result = 0; int sign = 1; float *p_creat, *p_mid; len = (k-1)*(k-1); /k阶矩阵的代数余之式为k-1阶矩阵 p_creat = (float*)calloc(len, sizeof(float); /分配内存单元 p_mid = p_creat; for (i = 0; i k; i+) for (j = 0; j k; j+) if (i != m & j != n) /将除第i行和第j列外的所有元素存储到以p_mid为首地址的内存单元 *p_mid+ = *(p+i*k+j); sign = (m+n)%2 = 0 ? 1 : -1; /代数余之式前面的正、负号 mid_result = (float)sign*MatDet(p_creat, k-1); free(p_creat); return mid_result;/-/功能: 打印n*n矩阵/入口参数: n*n矩阵的首地址,矩阵的行数n/返回值: 无返回值void print(float *p, int n) int i, j; for (i = 0; i n; i+) cout setw(4); for (j = 0; j n; j+) cout setiosflags(ios:right) *p+ setw(10); cout endl; /-/功能: 采用部分主元的高斯消去法求方阵A的逆矩阵B/入口参数: 输入方阵,输出方阵,方阵阶数/返回值: true or false/-bool Gauss(float AN, float BN, int n) int i, j, k; float max, temp; float tNN; /临时矩阵 /将A矩阵存放在临时矩阵tnn中 for (i = 0; i n; i+) for (j = 0; j n; j+) tij = Aij; /初始化B矩阵为单位阵 for (i = 0; i n; i+) for (j = 0; j n; j+) Bij = (i = j) ? (float)1 : 0; for (i = 0; i n; i+) /寻找主元 max = tii; k = i; for (j = i+1; j fabs(max) max = tji; k = j; /如果主元所在行不是第i行,进行行交换 if (k != i) for (j = 0; j n; j+) temp = tij; tij = tkj; tkj = temp; /B伴随交换 temp = Bij; Bij = Bkj; Bkj = temp; /判断主元是否为0, 若是, 则矩阵A不是满秩矩阵,不存在逆矩阵 if (tii = 0) cout There is no inverse matrix!; return false; /消去A的第i列除去i行以外的各行元素 temp = tii; for (j = 0; j n; j+) tij = tij / temp; /主对角线上的元素变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论