求逆矩阵的问题(C语言代码)
keil逆矩阵编程 -回复
![keil逆矩阵编程 -回复](https://img.taocdn.com/s3/m/ef1e1567580102020740be1e650e52ea5418ce73.png)
keil逆矩阵编程-回复“Keil逆矩阵编程”是指使用Keil开发软件来实现逆矩阵的计算和编程。
在本文中,我们将逐步讨论如何使用Keil来编程实现逆矩阵的计算。
在这个过程中,我们将介绍Keil的基本概念以及如何使用Keil来编写和执行逆矩阵的计算代码。
首先,我们需要了解一下什么是逆矩阵。
在线性代数中,逆矩阵是指对于一个方阵A,存在另一个方阵B,使得A和B的乘积等于单位矩阵。
即AA^-1 = I,其中I表示单位矩阵。
接下来,我们需要选择合适的编程语言来编写逆矩阵计算的代码。
Keil 是一款面向嵌入式系统的开发工具,它支持多种编程语言,如C和汇编语言。
在这里,我们将选择使用C语言来编写逆矩阵计算的代码。
首先,在Keil中创建一个新的项目。
在安装Keil后,打开软件并点击“Project”菜单,选择“New Project”选项。
然后,选择合适的目标芯片和编程语言(C语言)。
在选择文件存储位置后,点击“Save”按钮创建新项目。
接下来,我们需要在Keil中创建一个新的源文件来编写逆矩阵计算的代码。
在项目资源管理器中,右键单击“Source Group 1”,选择“Add New Item”选项,在弹出的对话框中选择“C Source File”,并为其命名为“inverse_matrix.c”。
现在,我们可以在“inverse_matrix.c”文件中开始编写逆矩阵计算的代码。
首先,我们需要定义一个函数来实现逆矩阵的计算。
在C语言中,我们可以使用数组来表示矩阵,并使用for循环来遍历矩阵元素。
以下是一个简单的示例代码,用于计算2x2矩阵的逆矩阵:c#include <stdio.h>void inverseMatrix(float matrix[2][2]){float det = matrix[0][0] * matrix[1][1] - matrix[0][1] *matrix[1][0];if (det == 0){printf("Matrix is not invertible.");return;}float temp = matrix[0][0];matrix[0][0] = matrix[1][1] / det;matrix[1][1] = temp / det;matrix[0][1] = -matrix[0][1] / det;matrix[1][0] = -matrix[1][0] / det;}在这个示例代码中,我们首先计算了矩阵的行列式(det),如果行列式等于0,则矩阵不可逆。
矩阵运算——C语言实现
![矩阵运算——C语言实现](https://img.taocdn.com/s3/m/2e0ba8bc43323968001c928f.png)
#include "stdafx.h"#include <stdlib.h>//结构体typedef struct{double ** mat;int row;int col;}Matrix;void InitialMatrix(Matrix *T, int row,int col); //只分配空间不初始化;void InitialMatrixZero(Matrix *T,int row, int col); //初始化为0void InitialMatrixRand(Matrix *T,int row, int col); //初始化为50以内随机正整数void InputMatrix(Matrix *T); //键盘输入矩阵void DestroyMatrix(Matrix *T); // 释放矩阵空间void PrintfMatrix(Matrix *T); //矩阵输出int AddMatrix(Matrix *A,Matrix *B,Matrix *C); // 矩阵加int MinusMatrix(Matrix *A,Matrix *B,Matrix *C); // 矩阵减int MultiMatrix(Matrix *A,Matrix *B,Matrix *C); //矩阵乘法double MeanMatrix(Matrix *T); //矩阵元素均值int SubMatrix(Matrix *T1,Matrix *T2,int BeginRow,int BeginCol,int EndRow,int EndCol); //求T1的子矩阵T2;测试程序参考界面如下所示:矩阵函数测试,请选择功能,输入对应的数字:***************************************************1:输入一个矩阵,求矩阵均值;2:产生一个随机数矩阵,求矩阵均值;3:输入两个个矩阵,求矩阵和;4:输入两个个矩阵,求矩阵差;5:输入两个个矩阵,求矩阵积;6:产生两个个随机数矩阵,求矩阵和;7:产生两个个随机数矩阵,求矩阵差;8:产生两个个随机数矩阵,求矩阵积;9:求矩阵的子阵,如矩阵的2-4行,1-3列的子阵;0:结束!#include <stdio.h>#include <stdlib.h>//结构体typedef struct {double **mat;int row;int col;} Matrix;//函数声明void InitialMatrix(Matrix *T, int row, int col);void InitialMatrixZero(Matrix *T, int row, int col);void InitialMatrixRand(Matrix *T, int row, int col);void InputMatrix(Matrix *T);void DestroyMatrix(Matrix *T); // 释放矩阵空间void PrintfMatrix(Matrix *T); //矩阵输出int AddMatrix(Matrix *A, Matrix *B, Matrix *C); // 矩阵加int MinusMatrix(Matrix *A, Matrix *B, Matrix *C); // 矩阵减int MultiMatrix(Matrix *A, Matrix *B, Matrix *C); //矩阵乘法double MeanMatrix(Matrix *T); //矩阵元素均值//int SubMatrix(Matrix *T1, Matrix *T2, int BeginRow, int BeginCol, int EndRow, int EndCol); //求T1的子矩阵T2;void NMatrix(void);//求逆矩阵//主函数int main(){int inputevent;//int i, j;int row, col;Matrix T;Matrix A;Matrix B;Matrix C;printf(" 矩阵函数测试,请选择功能,输入对应的数字:\n");printf(" ***************************************************\n\n"); printf("1:输入一个矩阵,求矩阵均值;\n");printf("2:产生一个随机数矩阵,求矩阵均值;\n");printf("3:输入两个个矩阵,求矩阵和;\n");printf("4:输入两个个矩阵,求矩阵差;\n");printf("5:输入两个矩阵,求矩阵积;");printf("\n6:产生两个随机数矩阵,求矩阵和;\n");printf("7:产生两个随机数矩阵,求矩阵差;\n");printf("8:产生两个随机数矩阵,求矩阵积;\n");printf("9:求矩阵的子阵,如矩阵的2-4行D,1-3列的子阵;\n");printf("10:输入一个方阵,求其逆矩阵\n");printf("0:结束!\n");printf("\n\n选择:");scanf("%d", &inputevent);while (inputevent != 0){if (inputevent == 1) {printf("您要输入的矩阵的行数和列数e.g:5,6:");scanf("%d,%d", &row, &col);InitialMatrix(&T, row, col);InitialMatrixZero(&T, T.row, T.col);InputMatrix(&T);printf("\n矩阵的平均值为:\n%lf\n\n", MeanMatrix(&T));DestroyMatrix(&T);}if (inputevent == 2) {printf("输入您要产生的矩阵的行数和列数e.g:5,6:");scanf("%d,%d", &row, &col);InitialMatrix(&T, row, col);InitialMatrixRand(&T, row, col);MeanMatrix(&T);PrintfMatrix(&T);printf("\n矩阵的平均值为:\n%lf\n\n", MeanMatrix(&T));DestroyMatrix(&T);}if (inputevent == 3) {printf("您要输入的矩阵A的行数和列数e.g:5,6:");scanf("%d,%d", &row, &col);InitialMatrix(&A, row, col);InitialMatrixZero(&A, A.row, A.col);InputMatrix(&A);printf("您要输入的矩阵B的行数和列数e.g:5,6:");scanf("%d,%d", &row, &col);InitialMatrix(&B, row, col);InitialMatrixZero(&B, B.row, B.col);InputMatrix(&B);InitialMatrix(&C, B.row, B.col);InitialMatrixZero(&C, C.row, C.col);if (AddMatrix(&A, &B, &C) == 1) {printf("\n\n矩阵的和为:A*B\n\n");PrintfMatrix(&C);}else printf("\n\n无法计算!\n\n");DestroyMatrix(&A);DestroyMatrix(&B);DestroyMatrix(&C);}if (inputevent == 4) {printf("您要输入的矩阵A的行数和列数e.g:5,6:");scanf("%d,%d", &row, &col);InitialMatrix(&A, row, col);InitialMatrixZero(&A, A.row, A.col);InputMatrix(&A);printf("您要输入的矩阵B的行数和列数e.g:5,6:");scanf("%d,%d", &row, &col);InitialMatrix(&B, row, col);InitialMatrixZero(&B, B.row, B.col);InputMatrix(&B);InitialMatrix(&C, B.row, B.col);InitialMatrixZero(&C, C.row, C.col);if (MinusMatrix(&A, &B, &C) == 1) {printf("\n矩阵的差为:A-B=\n\n");PrintfMatrix(&C);}else printf("\n\n无法计算!\n\n");DestroyMatrix(&A);DestroyMatrix(&B);DestroyMatrix(&C);}if (inputevent == 5) {int able;printf("您要输入的矩阵A的行数和列数e.g: 5,6: ");scanf("%d,%d", &row, &col);InitialMatrix(&A, row, col);InitialMatrixZero(&A, A.row, A.col);InputMatrix(&A);printf("您要输入的矩阵B的行数和列数e.g:5,6: ");scanf("%d,%d", &row, &col);InitialMatrix(&B, row, col);InitialMatrixZero(&B, B.row, B.col);InputMatrix(&B);InitialMatrix(&C, A.row, B.col);InitialMatrixZero(&C, C.row, C.col);able = MultiMatrix(&A, &B, &C);if (able == 1) {printf("\n积为:A*B\n\n");PrintfMatrix(&C);}else printf("\n\n无法计算!\n\n");DestroyMatrix(&A);DestroyMatrix(&B);DestroyMatrix(&C);}if (inputevent == 6) {printf("您要产生的矩阵A的行数和列数e.g:5,6: ");scanf("%d,%d", &row, &col);InitialMatrix(&A, row, col);InitialMatrixRand(&A, row, col);printf("A为:\n\n");PrintfMatrix(&A);printf("您要产生的矩阵B的行数和列数e.g:5,6: ");scanf("%d,%d", &row, &col);InitialMatrix(&B, row, col);InitialMatrixRand(&B, row, col);printf("B为:\n\n");PrintfMatrix(&B);InitialMatrix(&C, A.row, A.col);InitialMatrixZero(&C, C.row, C.col);if (AddMatrix(&A, &B, &C) == 1) {printf("\n矩阵的和为:A+B=\n\n");PrintfMatrix(&C);}else printf("\n\n无法计算!\n\n");DestroyMatrix(&A);DestroyMatrix(&B);DestroyMatrix(&C);}if (inputevent == 7) {printf("您要产生的矩阵A的行数和列数e.g:5,6: ");scanf("%d,%d", &row, &col);InitialMatrix(&A, row, col);InitialMatrixRand(&A, row, col);printf("您要产生的矩阵B的行数和列数e.g:5,6: ");scanf("%d,%d", &row, &col);InitialMatrix(&B, row, col);InitialMatrixRand(&B, row, col);InitialMatrix(&C, A.row, A.col);InitialMatrixZero(&C, C.row, C.col);if (MinusMatrix(&A, &B, &C) == 1) {printf("\n矩阵的差为:A-B=\n\n");PrintfMatrix(&C);}else printf("\n\n无法计算!\n\n");DestroyMatrix(&A);DestroyMatrix(&B);DestroyMatrix(&C);}if (inputevent == 8) {printf("您要产生的矩阵A的行数和列数e.g:5,6: \n");scanf("%d,%d", &row, &col);InitialMatrix(&A, row, col);InitialMatrixRand(&A, row, col);printf("A为:\n\n");PrintfMatrix(&A);printf("您要产生的矩阵B的行数和列数e.g:5,6: \n");scanf("%d,%d", &row, &col);InitialMatrix(&B, row, col);InitialMatrixRand(&B, row, col);printf("B为:\n\n");PrintfMatrix(&B);InitialMatrix(&C, A.row, A.col);InitialMatrixZero(&C, C.row, C.col);if (MultiMatrix(&A, &B, &C) == 1) {printf("\n积为:A*B=\n\n");PrintfMatrix(&C);;}else printf("\n\n无法计算;\n\n");DestroyMatrix(&A);DestroyMatrix(&B);DestroyMatrix(&C);}if (inputevent == 9) printf("对不起,该函数尚在完善中\n\n");if (inputevent == 10) NMatrix();if (inputevent == 0)break;printf(" 矩阵函数测试,请选择功能,输入对应的数字:\n");printf(" ***************************************************\n\n"); printf("1:输入一个矩阵,求矩阵均值;\n");printf("2:产生一个随机数矩阵,求矩阵均值;\n");printf("3:输入两个个矩阵,求矩阵和;\n");printf("4:输入两个个矩阵,求矩阵差;\n");printf("5:输入两个矩阵,求矩阵积;");printf("\n6:产生两个随机数矩阵,求矩阵和;\n");printf("7:产生两个随机数矩阵,求矩阵差;\n");printf("8:产生两个随机数矩阵,求矩阵积;\n");printf("9:求矩阵的子阵,如矩阵的2-4行D,1-3列的子阵;\n");printf("10:输入一个方阵,求其逆矩阵\n");printf("0:结束!\n");printf("\n\n选择:");scanf("%d", &inputevent);}return 0;}//其他函数void InitialMatrix(Matrix *T, int row, int col){//printf("分配内存中......\n");int i;int succ = 1;//T=(Matrix *)malloc(sizeof(Matrix));T->row = row;T->col = col;T->mat = (double **)malloc(T->row * sizeof(double *));if (T->mat == NULL) {succ = 0;}else {for (i = 0; i < T->row; i++) {T->mat[i] = (double *)malloc(T->col * sizeof(double));if (T->mat[i] == NULL) {succ = 0;break;}}//if(succ==1)// printf("内存分配成功|;?\n");//else printf("内存分配失败;\n");}}void InitialMatrixZero(Matrix *T, int row, int col) { //printf("矩阵初始化为零中......\n");int i, j;for (i = 0; i < row; i++)for (j = 0; j < col; j++)T->mat[i][j] = 0;//printf("矩阵初始化为零矩阵成功;\n"); }void InitialMatrixRand(Matrix *T, int row, int col) { int i, j;for (i = 0; i < row; i++)for (j = 0; j < col; j++)(*T).mat[i][j] = rand() % 50;}void InputMatrix(Matrix *T) {printf("输入矩阵:\n");int i, j;for (i = 0; i < (*T).row; i++)for (j = 0; j < (*T).col; j++)scanf("%lf", &(*T).mat[i][j]);}void DestroyMatrix(Matrix *T){int i;for (i = 0; i < (*T).row; i++)free((*T).mat[i]);}void PrintfMatrix(Matrix *T){int i, j;for (i = 0; i < (*T).row; i++){for (j = 0; j < (*T).col; j++)printf("%lf ", (*T).mat[i][j]);printf("\n");}}int AddMatrix(Matrix *A, Matrix *B, Matrix *C){int i, j;if ((*A).row == (*B).row && (*A).col == (*B).col){for (i = 0; i < (*A).row; i++)for (j = 0; j < (*A).col; j++)(*C).mat[i][j] = (*A).mat[i][j] + (*B).mat[i][j];for (i = 0; i < (*A).row; i++)for (j = 0; j < (*A).col; j++)return 1;}else {printf("这两个矩阵不能相加!\n");return 0;}}int MinusMatrix(Matrix *A, Matrix *B, Matrix *C){int i, j;if ((*A).row == (*B).row && (*A).col == (*B).col){for (i = 0; i < (*A).row; i++)for (j = 0; j < (*A).col; j++)(*C).mat[i][j] = (*A).mat[i][j] - (*B).mat[i][j];return 1;}elseprintf("这两个矩阵不能相减!\n");return 0;}int MultiMatrix(Matrix *A, Matrix *B, Matrix *C){int i=0, j=0;int k = 0;if ((*A).col == (*B).row){for (i = 0; i < (*A).row; i++) {for (j = 0; j < (*B).col; j++)for(k=0;k <(A->col);k++)(*C).mat[i][j] += (*A).mat[i][k] * (*B).mat[k][j];}return 1;}elseprintf("这两个矩阵不能相乘!\n");return 0;}double MeanMatrix(Matrix *T) //矩阵元素均值{double mean;double sum = 0;int i, j;for (i = 0; i < (*T).row; i++)for (j = 0; j < (*T).col; j++)sum += (*T).mat[i][j];mean = sum / ((*T).row*(*T).col);return mean;}void NMatrix(void){#define M 20#define N 20int i,j,m,n;float y=1.0;float a[M][2 * M];float b[N][2 * N];float t, x;int k, T;printf("输入方阵的维数:\n"); //请输入方阵,即行和列相等的矩阵。
C语言计算逆矩阵
![C语言计算逆矩阵](https://img.taocdn.com/s3/m/31aa560da200a6c30c22590102020740be1ecd82.png)
C语⾔计算逆矩阵花了4天写的,不过三天在重学线代。
1 #include<stdio.h>2 #include<stdlib.h> // 操作内存3 #include<math.h> // pow()函数,计算-1的n次⽅,可以不⽤这个函数,偷懒使⽤现成的45/*6显⽰矩阵7 matrix: 矩阵8 order: 阶数9*/10void showMatrix(float** matrix, int order)11 {12for (int i = 0; i < order; i++) {13for (int j = 0; j < order; j++) {14 printf(" %f ", matrix[i][j]);15 }16 printf("|\n");17 }18 }1920/*21交换两⾏22⼀开始想使⽤初等⾏变换计算,此函数可以删除,⽤不到23 x1:调换第⼀⾏24 x2:调换第⼆⾏25 order:矩阵阶数26 matrix:矩阵27*/28void replaceRow(int x1, int x2, int order, float **matrix)29 {30float temp;31 x1 -= 1;32 x2 -= 1;33for (int i = 0; i < order; i++) {34 temp = matrix[x1][i];35 matrix[x1][i] = matrix[x2][i];36 matrix[x2][i] = temp;37 }38 }3940/*41转置矩阵42 matrix: 矩阵43 order: 阶数44*/45void transposeMatrix(float** matrix, int order)46 {47float temp;48for (int i = 0; i < order; i++) {49for (int j = 0; j < i; j++) {50 temp = matrix[i][j];51 matrix[i][j] = matrix[j][i];52 matrix[j][i] = temp;53 }54 }55 }5657/*58获取除了某⾏某列的矩阵59 oldmatrix: 原本矩阵60 newmatrix: 新矩阵61 row: 要删除⾏62 col: 要删除列63 order: 阶数64*/65void get(float** oldmatrix, float** newmatrix, int row, int col, int order)66 {67// 删除了⼀⾏⼀列,所以新矩阵⾏列均⽐原矩阵少168int a = 0, b = 0;69int x, y, z = 0, w = 0;70// i,j循环原矩阵71for (int i = 0; i < order - 1; i++) {72for (int j = 0; j < order - 1; j++) {73// z,w代表⾏列的是否加⼀状态,防⽌多次加⼀,+1只需要1次74if (i >= row && z == 0) { a += 1; z = 1; }75if (j >= col && w == 0) { b += 1; w = 1; }7677 newmatrix[i][j] = oldmatrix[i+a][j+b];78 }79 a = 0;b = 0;80 z = 0;w = 0;81 }82 }8384/*85计算⾏列式86 matrix: 矩阵87 order: 阶数88*/89float calc(float** matrix, int order)90 {91// 递归求⾏列式值92float num=0;93int i, j;94if (order == 2) {95// 如果是⼆阶直接获取值96 num = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];97 }98else {99// 创建更⼩⼆维数组100 order -= 1;101float** matrixlow = (float**)malloc(sizeof(float*) * order);102for (i = 0; i < order; i++) {103 matrixlow[i] = (float*)malloc(sizeof(float) * order);104 }105 order += 1;106107// 循环展开第⼀⾏108for (j = 0; j < order; j++) {109110get(matrix, matrixlow, 0, j, order);111// 此处开始递归,调⽤⾃⾝函数112 num += matrix[0][j] * pow(-1, j) * calc(matrixlow, order - 1); 113 }114115// 释放内存116for (i = 0; i < order-1; ++i)free(*(matrixlow + i));117 }118119return num;120 }121122123/*124主函数125*/126int main()127 {128int order; // 矩阵阶数129int i, j;130float det;131132// 获取矩阵阶133 printf("输⼊矩阵阶:");134 scanf("%d", &order);135136 printf("输⼊的阶是:%d\n\n", order);137138// 申请⼆维数组内存139float** matrix = (float**)malloc(sizeof(float*) * order);140for (i = 0; i < order; i++) {141 matrix[i] = (float*)malloc(sizeof(float) * order);142 }143144// 获取输⼊145for (i = 0; i < order; i++) {146for (j = 0; j < order; j++) {147 printf("位置:( %d , %d)请输⼊数据:",i + 1,j + 1);148 scanf("%f", &matrix[i][j]);149 }150 }151152// 计算并显⽰det153 det = calc(matrix, order);154 printf("\ndet值为:%f",det);155// 0不能做除数156if (det == 0)157 printf("\n矩阵接近奇异值,结果可能不准确!");158 printf("\n\n");159160// 显⽰输⼊矩阵161 printf("\n输⼊的矩阵是:\n\n");162 showMatrix(matrix, order);163164// 申请⼆维数组存储结果165float** Rmatrix = (float**)malloc(sizeof(float*) * order);166for (i = 0; i < order; i++) {167 Rmatrix[i] = (float*)malloc(sizeof(float) * order);168 }169170171// 开始计算172if (order == 2) {173// 阶数为⼆直接运⾏公式174float n = 1 / (matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]);175 Rmatrix[0][0] = n * matrix[1][1];176 Rmatrix[0][1] = -n * matrix[0][1];177 Rmatrix[1][0] = -n * matrix[1][0];178 Rmatrix[1][1] = n * matrix[0][0];179 }180else {181// 转置矩阵并显⽰182 transposeMatrix(matrix, order);183 printf("\n\n转置后为:\n\n");184 showMatrix(matrix, order);185186// 循环求i,j位的代数余⼦式187for (i = 0; i < order; i++) {188for (j = 0; j < order; j++) {189// 申请⼆维数组190 order -= 1;191float** matrixlow = (float**)malloc(sizeof(float*) * order);192for (int t = 0; t < order; t++) {193 matrixlow[t] = (float*)malloc(sizeof(float) * order);194 }195 order += 1;196197// 获取除了i,j⾏的值组成⾏列式198get(matrix, matrixlow, i, j, order);199// 计算⾏列式值除以det200 Rmatrix[i][j] = pow(-1, i + j) * calc(matrixlow, order - 1) / det; 201202// 释放内存203for (int t = 0; t < order-1; ++t)free(*(matrixlow + t));204 }205 }206207 }208209// 显⽰逆矩阵210 printf("\n\n逆矩阵为:\n\n");211 showMatrix(Rmatrix, order);212213214//// 释放⼆维数组215for (i = 0; i < order; ++i)free(*(matrix + i));216for (i = 0; i < order; ++i)free(*(Rmatrix + i));217218return0;219 }。
C++求矩阵的逆程序代码
![C++求矩阵的逆程序代码](https://img.taocdn.com/s3/m/3533cd24aaea998fcc220ef0.png)
求解逆矩阵源代码:#include <stdio.h>#include <stdlib.h>#include <math.h>#define TINY 1.0e-20void inverse(double**,int);void ludcmp(double**, int, int*, double*);void lubksb(double**, int, int*, double*);double **matrix(int,int,int,int);double *vector(int,int);void free_matrix(double**,int,int,int,int);void free_vector(double*,int,int);void inverse(double **mat, int dim){int i,j,*indx;double **y,d,*col;y = matrix(0,dim-1,0,dim-1);indx = (int *)malloc((unsigned)(dim*sizeof(int)));col = vector(0,dim-1);ludcmp(mat,dim,indx,&d);for (j=0;j<dim;j++){for (i=0;i<dim;i++) col[i] = 0.0;col[j] = 1.0;lubksb(mat,dim,indx,col);for (i=0;i<dim;i++) y[i][j] = col[i];}for (i=0;i<dim;i++)for (j=0;j<dim;j++)mat[i][j] = y[i][j];free_matrix(y,0,dim-1,0,dim-1);free_vector(col,0,dim-1);free(indx);}void ludcmp(double **a, int n, int *indx, double *d){int i,imax,j,k;double big,dum,sum,temp;double *vv;vv = (double*)malloc((unsigned)(n*sizeof(double)));if (!vv){fprintf(stderr,"Error Allocating Vector Memory\n");exit(1);}*d = 1.0;for (i=0;i<n;i++){big = 0.0;for (j=0;j<n;j++){if ((temp=fabs(a[i][j])) > big) big = temp;}if (big == 0.0){fprintf(stderr,"Singular Matrix in Routine LUDCMP\n");for (j=0;j<n;j++) printf(" %f ",a[i][j]); printf("/n");exit(1);}vv[i] = 1.0/big;}for (j=0;j<n;j++){for (i=0;i<j;i++){sum = a[i][j];for (k=0;k<i;k++) sum -= a[i][k] * a[k][j];a[i][j] = sum;}big = 0.0;for (i=j;i<n;i++){sum = a[i][j];for (k=0;k<j;k++) sum -= a[i][k] * a[k][j];a[i][j] = sum;if ((dum=vv[i]*fabs(sum)) >= big){big = dum;imax = i;}}if (j != imax){for (k=0;k<n;k++){dum = a[imax][k];a[imax][k] = a[j][k];a[j][k] = dum;}*d = -(*d);vv[imax] = vv[j];}indx[j] = imax;if (a[j][j] == 0.0) a[j][j] = TINY;if (j != n-1){dum = 1.0 / a[j][j];for (i=j+1;i<n;i++) a[i][j] *= dum;}}free(vv);}void lubksb(double **a, int n, int *indx, double *b) {int i,ip,j,ii=-1;double sum;for (i=0;i<n;i++){ip = indx[i];sum = b[ip];b[ip] = b[i];if (ii>=0)for (j=ii;j<i;j++) sum -= a[i][j] * b[j];else if (sum) ii = i;b[i] = sum;}for (i=n-1;i>=0;i--){sum = b[i];for (j=i+1;j<n;j++) sum -= a[i][j] * b[j];b[i] = sum / a[i][i];}}。
矩阵求逆的C++代码
![矩阵求逆的C++代码](https://img.taocdn.com/s3/m/3ec75e3d0166f5335a8102d276a20029bd646360.png)
矩阵求逆的C++代码按照算法导论上矩阵求逆的原理,写了个C++代码。
有A*X=I,则X为inv(A)。
1. ⽤⾼斯消元法对原矩阵LUP分解,使得PA=LU。
P为置换矩阵,为了使每次消元时取有列最⼤值的⾏。
L下三⾓阵,U上三⾓阵。
2. 根据分解结果求出线性⽅程组A*xi=ei的xi向量,ei是单位阵I的列向量i,则xi为X的对应列向量。
3. 把xi组合成X,即为逆矩阵。
struct LUPMat{float* L, *U, *P; //dim*dimint* pai; //dimint dim; //dimension of LUP, size is d*d};void DelLUPMat( LUPMat lm){delete [] lm.L;delete [] lm.U;delete [] lm.P;delete [] lm.pai;}void printMatrix(float* mat, int dim){for(int i=0; i<dim; i++){for(int j=0; j<dim; j++)printf("%2.2f ", mat[i*dim+j]);printf("\n");}}void printVector(float* vec, int dim){for(int i=0; i<dim; i++){printf("%2.2f ", vec[i]);}printf("\n");//LUP decomposition of dim*dim matrix LUPMat LUPDecomp(float *A, int dim){float* mat = new float[dim*dim];for(int i=0; i<dim; i++)for(int j=0; j<dim; j++)mat[i*dim+j] = A[i*dim+j];float* l = new float[dim*dim];float* u = new float[dim*dim];float* p = new float[dim*dim];int* pai = new int[dim]; //pai[i]=k, then p[i][k]=1 for(int i=0; i<dim; i++)pai[i] = i;float cmax; //max value of columnint maxLineNo; //line of cmaxfor(int k=0; k<dim; k++){//find max value of the k-th columncmax=0;for(int i=k; i<dim; i++){if(abs(mat[i*dim+k])>abs(cmax)){cmax = mat[i*dim+k];maxLineNo = i;}}if(cmax==0){printf("singular matrix!\n");exit(1);}int tmpk = pai[k];pai[k] = pai[maxLineNo];pai[maxLineNo] = tmpk;float tmpLn;//exchange linefor(int li=0; li<dim; li++)tmpLn = mat[k*dim+li];mat[k*dim+li] = mat[maxLineNo*dim+li];mat[maxLineNo*dim+li] = tmpLn;}//LU decompositionfor(int i=k+1; i<dim; i++){mat[i*dim+k] = mat[i*dim+k]/mat[k*dim+k];for(int j=k+1; j<dim; j++)mat[i*dim+j] = mat[i*dim+j] - mat[i*dim+k]*mat[k*dim+j]; }}for(int i=0; i<dim; i++){for(int j=0; j<dim; j++){if(i>j){l[i*dim+j] = mat[i*dim+j];u[i*dim+j] = 0;}else if(i==j){u[i*dim+j] = mat[i*dim+j];l[i*dim+j] = 1;}else{u[i*dim+j] = mat[i*dim+j];l[i*dim+j] = 0;}}}for(int i=0; i<dim; i++){for(int j=0; j<dim; j++)p[i*dim+j] = 0;p[i*dim+pai[i]] = 1;}LUPMat ret;ret.L = l;ret.U = u;ret.P = p;ret.pai = pai;ret.dim = dim;delete [] mat;return ret;}//testbenchvoid LUPDecomp_tb(){float mat[DIM*DIM] = {2, 0, 2, 0.6,3, 3, 4, -2,5, 5, 4, 2,-1, -2, 3.4, -1};printMatrix(mat, DIM);LUPMat lm = LUPDecomp(mat, DIM);cout<<"P = "<<endl;printMatrix(lm.P, DIM);cout<<"L = "<<endl;printMatrix(lm.L, DIM);cout<<"U = "<<endl;printMatrix(lm.U, DIM);DelLUPMat(lm);}float *SolveLinearEq(float* A, float* b, int dim) {LUPMat lm = LUPDecomp(A, dim);float* x = new float[dim];float* y = new float[dim];for(int i=0; i<dim; i++){y[i] = b[lm.pai[i]];for(int j=0; j<i; j++)y[i] -= y[j]*lm.L[i*dim+j];}//cout<<"y:"<<endl;printVector(y, dim);for(int i=dim-1; i>=0; i--){for(int j=dim-1; j>i; j--)y[i] -= lm.U[i*dim+j]*x[j];x[i] = y[i]/lm.U[i*dim+i];}//cout<<"y:"<<endl;printVector(y, dim);delete [] y;DelLUPMat(lm);return x;}void SolveLinearEq_tb(){const int dim=3;float A[dim*dim] ={1, 2, 0,3, 4, 4,5, 6, 3};cout<<"A: "<<endl;printMatrix(A, dim);float b[dim] ={3, 7, 8};float* x = SolveLinearEq(A, b, dim); cout<<"x: "<<endl;printVector(x, dim);delete [] x;}float* InverseMatrix(float *A, int dim) {float *invA = new float[dim*dim]; float *e = new float[dim];float *x;for(int i=0; i<dim; i++)e[i] = 0;for(int i=0; i<dim; i++){e[i] = 1;if(i>0) e[i-1]=0;x = SolveLinearEq(A, e, dim);// cout<<"No. "<<i<<" x: ";printVector(x, dim);// cout<<"e: ";printVector(e, dim);for(int j=0; j<dim; j++)invA[j*dim+i] = x[j];}delete [] x;return invA;}float* isInverse(float* A, float* invA, int dim){float* aij = new float[dim*dim];for(int i=0; i<dim; i++)for(int j=0; j<dim; j++){aij[i*dim+j]=0;for(int k=0; k<dim; k++)aij[i*dim+j] += A[i*dim+k]*invA[k*dim+j]; }return aij;}void InverseMatrix_tb(){const int dim=3;float A[dim*dim] ={1, 2, 0,3, 4, 4,5, 6, 3};cout<<"A: "<<endl;printMatrix(A, dim);float* invA = InverseMatrix(A, dim);cout<<"inverse of A: "<<endl;printMatrix(invA, dim);float* aij = isInverse(A, invA, dim); cout<<"A*invA:"<<endl;printMatrix(aij, dim);delete [] invA;delete [] aij;}测试程序的结果:。
C语言求矩阵的逆矩阵
![C语言求矩阵的逆矩阵](https://img.taocdn.com/s3/m/cc7d72fda26925c52dc5bf46.png)
C语言求矩阵的逆矩阵班级:自动化1604小组成员:潘孝枫金豆2017年4月作业要求:1.用C语言编程;2.查阅相关资料,至少了解三种以上的求矩阵的逆的方法;3.俩人一组,提交大作业报告,含源代码。
方法一:用伴随矩阵求矩阵的逆矩阵(潘孝枫)最主要的问题就是求解矩阵的逆矩阵,而且是一个动态矩阵1.求解矩阵的伴随矩阵,套用求行列式的函数解决问题的关键是如何运用一个循环递归将求行列式的函数反复嵌套函数的分块1.求矩阵的行列式的函数2.求余子式的函数3.求逆的函数#include <stdio.h>#include <math.h>#define N 9 //默认行列式最大输入阶数为9 float Fun(int n, float a[N][N] ); //定义行列式计算程序,n为行列式阶数,a为矩阵a/*主程序*/int main(void){int n ; //定义阶数ninti, j, i1, j1,i2 ,j2 ; //定义循环变量float a[N][N] , b[N][N] , c[N][N]; //定义数组,a为原始录入数组,b为中间变量数组,用于提取与计算余子式,c为输出结果数组float d; //定义a的行列式值printf("Input the order of matrix a:"); //输入a的阶数scanf("%d",&n);printf("Input matrix a:\n"); //输入矩阵afor( i = 0; i< n; i++){for( j = 0; j < n; j++){scanf("%f", &a[i][j]);}}d=Fun( n, a ); //计算a的行列式if(fabs(d)<1e-6) //判断a的行列式值是否为0{printf("The determinant is not invertible!"); //输出“行列式值为0,不可逆”}else{printf("The determinant of a is %f",d); //非0继续运算if(n==1) //阶数为1的情况{c[0][0]=1/d;}else //阶数大于1的情况{for( i = 0; i<=n-1; i++){for( j = 0; j <= n-1; j++){for(i1=0, i2=0; i2<n-1; i1++, i2++){for(j1=0, j2=0; j2<n-1; j1++, j2++){if(i1 == i){i1++;}if(j1 == j){j1++;}b[i2][j2]=a[i1][j1]; //提取a[i][j]所对应的余子式到矩阵b中}}c[j][i]=pow( -1 , i + j ) * Fun( n - 1 , b)/d; //计算a[i][j]对应的代数余子式,存入矩阵c中并完成转置}}}printf("\n"); //输出结果for(i=0;i<n;i++){for(j=0;j<n;j++){printf("%10f",c[i][j]);}printf("\n");}}}/*求行列式*/float Fun( int n, float a[N][N] ) //定义求矩阵行列式的程序,采用逐步降阶求值{float b[N][N]; //定义矩阵binti = 0, j = 0; //定义循环变量i,jfloat sum = 0; //定义行列式运算结果sumint c = 0,p = 0; //定义辅助变量c,pif(n == 1) //行列式阶数为1函数直接返回a[0][0]值{return a[0][0];}for(i = 0;i < n; i++) //针对行列式第一列展开{for(c = 0;c < n-1; c++){for(j = 0;j < n-1;j++){if (c <i) //判断录入数组b时行数值,如果c大于i,则在执行录入数组a时行数下移一行,否则不执行数+1的操作{p = 0;}else{p = 1;}b[c][j] = a[c+p][j+1]; //取出a[i][j]第一列每个元素对应的余子式存入数组b中}}sum += a[i][0] * Fun(n - 1, b ) * pow(- 1 , i ); //求出a第一列每个元素代数余子式之和,其中嵌套Fun进行逐步降阶完成高阶行列式计算}return sum;}方法二:用行初等变换来求矩阵的逆//应用矩阵初等变换的方法求逆矩阵//参数说明:// naturalmat 原矩阵// num 矩阵的阶数// InvMat 求解结果,逆矩阵bool Matrix_Inv(double **naturalmat,int num,double **InvMat){int i,j,k;double **MatEnhanced;//增广矩阵(A|E)MatEnhanced = (double**)malloc(num*sizeof(double*)); for(i=0;i<num;i++)MatEnhanced[i] = (double*)malloc(2*num*sizeof(double));double *temp;temp = (double*)malloc(2*num*sizeof(double));double xishu=1;//初等变换时系数,设初值为1for(i=0;i<num;i++) //增广矩阵赋值,前半部分 {for(j=0;j<num;j++)MatEnhanced[i][j] = naturalmat[i][j];}for(i=0;i<num;i++) //增广矩阵赋值,后半部分 {for(j=num;j<2*num;j++)MatEnhanced[i][j] = 0;//先将后半部分全部赋值为0MatEnhanced[i][i+num] = 1;//再将其对角线部分赋值为1}//接下来进行初等行变换for(i=0;i<num;i++){if(MatEnhanced[i][i] == 0)//如果前半部分的对角线上的元素为0,此时进行行变换{if(i == num-1)//如果是最后一行,那么说明该矩阵不可return false;//对第i行以后的各行进行判断,找到第i个元素不为零的行,并与第i行进行交换for(j=i;j<num;j++){if(MatEnhanced[j][i] != 0){k = j;//记住该行的行号break;//退出循环}}//接下来对第i行和第k行进行交换temp = MatEnhanced[k];//第k行MatEnhanced[k] = MatEnhanced[i];MatEnhanced[i] = temp;//初等变换for(j=0;j<num;j++)//对其他行的所有列进行计算{if(j != i)//本行不参与计算{if(MatEnhanced[j][i] != 0)//只有当其不为零时进行计算,否则不计算{xishu = MatEnhanced[j][i]/MatEnhanced[i][i];for(k=i;k<2*num;k++)//对后面的所有列进行计算MatEnhanced[j][k] -= xishu*MatEnhanced[i][k];}}}}//将本行所有列都除以对角线上的值,将前半部分化成单位矩阵xishu = MatEnhanced[i][i];for(j=i;j<2*num;j++)if(xishu != 0)MatEnhanced[i][j] /= xishu;}//计算完成后,后半部分即为原矩阵的逆矩阵,将其赋值给InvMat. for(i=0;i<num;i++){for(j=0;j<num;j++)InvMat[i][j] = MatEnhanced[i][j+num];}//内存释放free(MatEnhanced);free(temp);return true;//返回}。
上三角矩阵的逆 c语言
![上三角矩阵的逆 c语言](https://img.taocdn.com/s3/m/3a4db9532379168884868762caaedd3383c4b58e.png)
上三角矩阵的逆c语言全文共四篇示例,供读者参考第一篇示例:上三角矩阵是指所有主对角线以下的元素都为零的矩阵。
在数学和计算机科学领域中,上三角矩阵是一种常见的矩阵类型,在矩阵运算和线性代数中有着重要的应用。
在本文中,我们将探讨上三角矩阵的逆的计算方法,并使用C语言来实现这一过程。
让我们来看一个简单的上三角矩阵的例子:\[A = \begin{bmatrix}1 &2 &3 \\0 & 4 & 5 \\0 & 0 & 6 \\\end{bmatrix}\]这个矩阵是一个3阶的上三角矩阵,我们可以看到所有主对角线以下的元素都是零。
上三角矩阵的逆矩阵可以通过行变换和消元法来计算,其计算方法和普通矩阵的逆矩阵略有不同,但原理是一样的。
计算上三角矩阵的逆矩阵的一种方法是利用矩阵的基本变换。
具体步骤如下:1. 将待求逆的矩阵与单位矩阵拼接在一起,形成一个增广矩阵;2. 通过行变换将增广矩阵转化为对角矩阵,此时左边的部分就是矩阵的逆。
在C语言中,我们可以使用数组来表示矩阵,并编写函数来实现矩阵运算。
下面是一个简单的C程序,用来计算上三角矩阵的逆矩阵:```c#include <stdio.h>// 定义矩阵大小#define N 3// 函数原型void printMatrix(double matrix[N][N*2]);void upperTriangularInverse(double matrix[N][N]);upperTriangularInverse(matrix);return 0;}// 打印矩阵void printMatrix(double matrix[N][N*2]) {for (int i = 0; i < N; i++) {for (int j = 0; j < N*2; j++) {printf("%.2f ", matrix[i][j]);}printf("\n");}}在这个程序中,我们首先定义了一个3x6的数组来表示增广矩阵。
c语言实现矩阵的加减乘除求逆运算
![c语言实现矩阵的加减乘除求逆运算](https://img.taocdn.com/s3/m/ab0f6377cc22bcd127ff0cd8.png)
#include〈stdio.h>#include〈stdlib。
h〉#define col 3#define row 3class matrix//类的定义{private:double m[col][row];//矩阵设置为私有的,public:matrix(){}//无参数的构造函数matrix(double a[col][row]);//有参数的构造函数matrix Add(matrix &b);//加法运算声明matrix Sub(matrix &b);//减法运算声明matrix Mul(matrix &b);//乘法运算声明matrix Div(matrix &b);//除法运算声明matrix Inverse();//求逆运算声明~matrix();//析构函数声明void display();//显示函数声明};matrix::matrix(double a[col][row])//构造函数的定义{int i,j;for(i=0;i<col;i++)for(j=0;j〈row;j++)m[i][j]=a[i][j];}matrix matrix::Add(matrix &b)//加法运算{int i,j;matrix*c=(matrix*)malloc(sizeof(matrix));for(i=0;i<col;i++)for(j=0;j<row;j++)c—〉m[i][j]=m[i][j]+b.m[i][j];return(*c);}matrix matrix::Sub(matrix &b)//减法运算{int i,j;matrix*c=(matrix*)malloc(sizeof(matrix));for(i=0;i〈col;i++)for(j=0;j<row;j++)c->m[i][j]=m[i][j]—b。
m[i][j];return *c;}matrix matrix::Mul(matrix &b)//乘法运算{int i,j,k;double sum=0;matrix*c=(matrix*)malloc(sizeof(matrix));for(i=0;i<col;i++){for(j=0;j〈row;j++){for(k=0;k〈row;k++)sum+=m[i][k]*(b.m[k][j]);c-〉m[i][j]=sum;sum=0;}}return(*c);}matrix matrix::Div(matrix &b)//除法运算{//除法直接求解,参见主函数matrix c;return(c);}matrix matrix::Inverse()//求逆运算{//参考博客:http:///rollenholt/articles/2050662。
C语言求逆矩阵案例详解
![C语言求逆矩阵案例详解](https://img.taocdn.com/s3/m/fcef2008fe00bed5b9f3f90f76c66137ee064f17.png)
C语⾔求逆矩阵案例详解⼀般求逆矩阵的⽅法有两种,伴随阵法和初等变换法。
但是这两种⽅法都不太适合编程。
伴随阵法的计算量⼤,初等变换法⼜难以编程实现。
适合编程的求逆矩阵的⽅法如下:1. 对可逆矩阵A进⾏QR分解:A=QR2. 求上三⾓矩阵R的逆矩阵3. 求出A的逆矩阵:A^(-1)=R^(-1)Q^(H)以上三步都有具体的公式与之对应,适合编程实现。
C语⾔实现代码:#include <stdio.h>#include <math.h>#define SIZE 8double b[SIZE][SIZE]={0};//应该读作“贝尔塔”,注释中⽤B表⽰double t[SIZE][SIZE]={0};//求和的那项double Q[SIZE][SIZE]={0};//正交矩阵double QH[SIZE][SIZE]={0};//正交矩阵的转置共轭double R[SIZE][SIZE]={0};//double invR[SIZE][SIZE]={0};//R的逆矩阵double invA[SIZE][SIZE]={0};//A的逆矩阵,最终的结果//={0};//double matrixR1[SIZE][SIZE]={0};double matrixR2[SIZE][SIZE]={0};//double init[3][3]={3,14,9,6,43,3,6,22,15};double init[8][8]={0.0938 , 0.5201 , 0.4424 , 0.0196 , 0.3912 , 0.9493 , 0.9899 , 0.8256,0.5254 , 0.3477 , 0.6878 , 0.3309 , 0.7691 , 0.3276 , 0.5144 , 0.7900,0.5303 , 0.1500 , 0.3592 , 0.4243 , 0.3968 , 0.6713 , 0.8843 , 0.3185,0.8611 , 0.5861 , 0.7363 , 0.2703 , 0.8085 , 0.4386 , 0.5880 , 0.5341,0.4849 , 0.2621 , 0.3947 , 0.1971 , 0.7551 , 0.8335 , 0.1548 , 0.0900,0.3935 , 0.0445 , 0.6834 , 0.8217 , 0.3774 , 0.7689 , 0.1999 , 0.1117,0.6714 , 0.7549 , 0.7040 , 0.4299 , 0.2160 , 0.1673 , 0.4070 , 0.1363,0.7413 , 0.2428 , 0.4423 , 0.8878 , 0.7904 , 0.8620 , 0.7487 , 0.6787};/*/函数名:int main()输⼊:输出:功能:求矩阵的逆 pure C language⾸先对矩阵进⾏QR分解之后求上三⾓矩阵R的逆阵最后A-1=QH*R-1,得到A的逆阵。
矩阵计算器代码实现 C语言
![矩阵计算器代码实现 C语言](https://img.taocdn.com/s3/m/56dcf8f9a300a6c30d229f9f.png)
#include<iostream>#include<stdlib.h>#include<math.h>#define N 10 //定义方阵的最大阶数为10#include <iomanip>using namespace std;double MatDet(double *p, int n); //求矩阵的行列式double Creat_M(double *p, int m, int n, int k); //求矩阵元素A(m, n)的代数余子式void print(double *p, int n); //输出矩阵n*nclass Matrix{private:int row,col;double **eM ;public:creatM();//创造矩阵outM(Matrix A);//输出矩阵add(Matrix A,Matrix B);//矩阵相加minus(Matrix A,Matrix B);//矩阵相减transpose(Matrix A);//矩阵转置mutiply(Matrix A,Matrix B);//矩阵相乘h(Matrix A);//求行列式,和上三角inverse(Matrix A);//矩阵的逆};void main(){cout<<"******矩阵计算器******"<<endl;cout<<"请选择你要进行的操作"<<"\n"<<"1:相加2:相减3:转置4:相乘5:求行列式和上三角6:求逆"<<endl;int c;cin>>c;switch(c){case 1:{Matrix m1,m2;cout<<"请输入第一个矩阵"<<endl;m1.creatM();cout<<"请输入第二个矩阵"<<endl;m2.creatM();m1.add(m1,m2);break;}case 2:{Matrix m1,m2;cout<<"请输入第一个矩阵"<<endl;m1.creatM();cout<<"请输入第二个矩阵"<<endl;m2.creatM();m1.minus(m1,m2);break;}case 3:{Matrix A;A.transpose(A);break;}case 4:{Matrix m1,m2;cout<<"请输入第一个矩阵"<<endl;m1.creatM();cout<<"请输入第二个矩阵"<<endl;m2.creatM();m1.mutiply(m1,m2);break;}case 5:{Matrix m;cout<<"请输入矩阵"<<endl;m.creatM();m.h(m);break;}case 6:{double *buffer, *p; //定义数组首地址指针变量int row, num; //定义矩阵的行数和矩阵元素个数int i, j;double determ; //定义矩阵的行列式double a[N][N], b[N][N];int n;cout << "采用逆矩阵的定义法求矩阵的逆矩阵!\n";cout << "请输入矩阵的行数: ";cin >> row;num = 2 * row * row;buffer = (double *)calloc(num, sizeof(double)); //分配内存单元p = buffer;if (NULL != p){for (i = 0; i < row; i++){cout << "Please input the number of " << i+1 << " row: ";for (j = 0; j < row; j++){cin >> *p++;}}}else{cout << "无法分配内存\n";}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) = (double)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); //释放内存空间getchar();break;}}}Matrix::creatM(){cout<<"请依次输入矩阵的行和列"<<endl;cin>>row>>col;eM=(double**) malloc(row*sizeof(double*)) ;for(int i=0; i<row; i++)eM[i] = (double *)malloc(col * sizeof(double));cout<<"请输入矩阵"<<endl;for( i=0;i<row;i++){for(int j=0;j<col;j++)cin>>eM[i][j] ;}}Matrix::outM(Matrix A){for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<eM[i][j]<<" ";cout<<endl;}}Matrix::add(Matrix A, Matrix B){if(A.col!=B.col || A.row!=B.row){cout<<"行列不同"<<endl;}else{for(int i=0;i<A.row;i++){for(int j=0;j<A.col;j++){A.eM[i][j]=A.eM[i][j]+B.eM[i][j];}}cout<<"结果为:\n";A.outM(A);}}Matrix::minus(Matrix A, Matrix B){if(A.col!=B.col || A.row!=B.row){cout<<"行列不同"<<endl;}else{for(int i=0;i<A.row;i++){for(int j=0;j<A.col;j++){A.eM[i][j]=A.eM[i][j]+B.eM[i][j];}}cout<<"结果为:\n";A.outM(A);}}Matrix::transpose(Matrix A){int i,j;cout<<"请输入矩阵"<<endl;A.creatM();cout<<"原矩阵为:\n";A.outM(A);Matrix R;R.row=A.col;R.col=A.row;R.eM=(double**) malloc(R.row*sizeof(double*)) ;for( i=0; i<R.row; i++)R.eM[i] = (double *)malloc(R.col * sizeof(double));for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){R.eM[i][j]=0;}}for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){R.eM[i][j]=A.eM[j][i];}}cout<<"结果为:"<<endl;R.outM(R);}Matrix::mutiply(Matrix A, Matrix B){if(A.col!=B.row){cout<<"不能相乘"<<endl;}else{int i;Matrix R;R.row=A.row;R.col=B.col;R.eM=(double**) malloc(R.row*sizeof(double*)) ;for( i=0; i<row; i++)R.eM[i] = (double *)malloc(R.col * sizeof(double));for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){R.eM[i][j]=0;}}for(i=0;i<R.row;i++){for(int j=0;j<R.col;j++){for(int k=0;k<A.col;k++){R.eM[i][j]+=A.eM[i][k]*B.eM[k][j];}}}cout<<"结果为:\n"<<endl;R.outM(R);}}Matrix::h(Matrix A){if(A.col!=A.row){cout<<"不是方阵"<<endl;}else{int ii,jj,k,u;int iter = 0; //记录行变换的次数(交换)double det1=1,yin;int n=A.row;for(ii=0 ; ii<n; ii++){if(A.eM[ii][ii] == 0)for(jj=ii; jj<n; jj++){if(A.eM[jj][ii] != 0){double temp1;for(int i=0 ; i<n ; i++);{temp1 = A.eM[ii][i];A.eM[ii][i] = A.eM[jj][i];A.eM[ii][i] = temp1;}iter ++;}}for(k=ii+1; k<n; k++){yin = -1 * A.eM[k][ii] / A.eM[ii][ii] ;for(u=0; u<n; u++){A.eM[k][u] = A.eM[k][u] + A.eM[ii][u] * yin;}}}for(ii=0; ii<n; ii++) //求对角线的积即行列式的值det1 = det1 * A.eM[ii][ii];//行变换偶数次符号不变if(iter%2 == 1)det1= -det1;cout<<"矩阵的行列式的值为:"<<det1<<endl;cout<<"转换的上三角矩阵为:"<<endl;for(int i=0; i<n; i++){for(int j=0; j<n; j++){cout<<" "<<A.eM[i][j];}cout<<endl;}cout<<endl;}}double MatDet(double *p, int n){int ii,jj,k,u;int iter = 0; //记录行变换的次数(交换)double det1=1,yin;for(ii=0 ; ii<n; ii++){if(*(p+ii*n+ii) == 0)for(jj=ii; jj<n; jj++){if(*(p+jj*n+ii) != 0){double temp1;for(int i=0 ; i<n ; i++){temp1 = *(p+ii*n+i);*(p+ii*n+i) = *(p+jj*n+i);*(p+ii*n+i) = temp1;}iter ++;}}for(k=ii+1; k<n; k++){yin = -1 * (*(p+k*n+ii)) / (*(p+ii*n+ii)) ;for(u=0; u<n; u++){*(p+k*n+u) = *(p+k*n+u) + *(p+ii*n+u) * yin;}}}for(ii=0; ii<n; ii++) //求对角线的积即行列式的值det1 = det1 * (*(p+ii*n+ii));//行变换偶数次符号不变if(iter%2 == 1)det1= -det1;return det1;}//----------------------------------------------------------------------------//功能: 求k*k矩阵中元素A(m, n)的代数余之式//入口参数: k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k//返回值: k*k矩阵中元素A(m, n)的代数余之式//----------------------------------------------------------------------------double Creat_M(double *p, int m, int n, int k){int len,t;int i, j;double mid_result = 0;int sign = 1;double *p_creat, *p_mid;len = (k-1)*(k-1); //k阶矩阵的代数余之式为k-1阶矩阵p_creat = (double*)calloc(len, sizeof(double)); //分配内存单元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);//代数余之式前面的正、负号t=MatDet(p_creat, k-1);mid_result = sign*t;return mid_result;free(p_creat);}//-----------------------------------------------------//功能: 打印n*n矩阵//入口参数: n*n矩阵的首地址,矩阵的行数n//返回值: 无返回值//-----------------------------------------------------void print(double *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;}}。
C#计算矩阵的逆矩阵方法实例分析
![C#计算矩阵的逆矩阵方法实例分析](https://img.taocdn.com/s3/m/b8b6d3d36037ee06eff9aef8941ea76e58fa4a9f.png)
C#计算矩阵的逆矩阵⽅法实例分析本⽂实例讲述了C#计算矩阵的逆矩阵⽅法。
分享给⼤家供⼤家参考。
具体如下:1.代码思路1)对矩阵进⾏合法性检查:矩阵必须为⽅阵2)计算矩阵⾏列式的值(Determinant函数)3)只有满秩矩阵才有逆矩阵,因此如果⾏列式的值为0(在代码中以绝对值⼩于1E-6做判断),则终⽌函数,报出异常4)求出伴随矩阵(AdjointMatrix函数)5)逆矩阵各元素即其伴随矩阵各元素除以矩阵⾏列式的商2.函数代码(注:本段代码只实现了⼀个思路,可能并不是该问题的最优解)/// <summary>/// 求矩阵的逆矩阵/// </summary>/// <param name="matrix"></param>/// <returns></returns>public static double[][] InverseMatrix(double[][] matrix){//matrix必须为⾮空if (matrix == null || matrix.Length == 0){return new double[][] { };}//matrix 必须为⽅阵int len = matrix.Length;for (int counter = 0; counter < matrix.Length; counter++){if (matrix[counter].Length != len){throw new Exception("matrix 必须为⽅阵");}}//计算矩阵⾏列式的值double dDeterminant = Determinant(matrix);if (Math.Abs(dDeterminant) <= 1E-6){throw new Exception("矩阵不可逆");}//制作⼀个伴随矩阵⼤⼩的矩阵double[][] result = AdjointMatrix(matrix);//矩阵的每项除以矩阵⾏列式的值,即为所求for (int i = 0; i < matrix.Length; i++){for (int j = 0; j < matrix.Length; j++){result[i][j] = result[i][j] / dDeterminant;}}return result;}/// <summary>/// 递归计算⾏列式的值/// </summary>/// <param name="matrix">矩阵</param>/// <returns></returns>public static double Determinant(double[][] matrix){//⼆阶及以下⾏列式直接计算if (matrix.Length == 0) return 0;else if (matrix.Length == 1) return matrix[0][0];else if (matrix.Length == 2){return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];}//对第⼀⾏使⽤“加边法”递归计算⾏列式的值double dSum = 0, dSign = 1;for (int i = 0; i < matrix.Length; i++){double[][] matrixTemp = new double[matrix.Length - 1][];for (int count = 0; count < matrix.Length - 1; count++){matrixTemp[count] = new double[matrix.Length - 1];}for (int j = 0; j < matrixTemp.Length; j++){for (int k = 0; k < matrixTemp.Length; k++){matrixTemp[j][k] = matrix[j + 1][k >= i ? k + 1 : k];}}dSum += (matrix[0][i] * dSign * Determinant(matrixTemp)); dSign = dSign * -1;}return dSum;}/// <summary>/// 计算⽅阵的伴随矩阵/// </summary>/// <param name="matrix">⽅阵</param>/// <returns></returns>public static double[][] AdjointMatrix(double [][] matrix){//制作⼀个伴随矩阵⼤⼩的矩阵double[][] result = new double[matrix.Length][];for (int i = 0; i < result.Length; i++){result[i] = new double[matrix[i].Length];}//⽣成伴随矩阵for (int i = 0; i < result.Length; i++){for (int j = 0; j < result.Length; j++){//存储代数余⼦式的矩阵(⾏、列数都⽐原矩阵少1)double[][] temp = new double[result.Length - 1][];for (int k = 0; k < result.Length - 1; k++){temp[k] = new double[result[k].Length - 1];}//⽣成代数余⼦式for (int x = 0; x < temp.Length; x++){for (int y = 0; y < temp.Length; y++){temp[x][y] = matrix[x < i ? x : x + 1][y < j ? y : y + 1];}}//Console.WriteLine("代数余⼦式:");//PrintMatrix(temp);result[j][i] = ((i + j) % 2 == 0 ? 1 : -1) * Determinant(temp); }}//Console.WriteLine("伴随矩阵:");//PrintMatrix(result);return result;}/// <summary>/// 打印矩阵/// </summary>/// <param name="matrix">待打印矩阵</param>private static void PrintMatrix(double[][] matrix, string title = "") {//1.标题值为空则不显⽰标题if (!String.IsNullOrWhiteSpace(title)){Console.WriteLine(title);}//2.打印矩阵for (int i = 0; i < matrix.Length; i++){for (int j = 0; j < matrix[i].Length; j++){Console.Write(matrix[i][j] + "\t");//注意不能写为:Console.Write(matrix[i][j] + '\t');}Console.WriteLine();}//3.空⾏Console.WriteLine();}3.Main函数调⽤static void Main(string[] args){double[][] matrix = new double[][]{new double[] { 1, 2, 3 },new double[] { 2, 2, 1 },new double[] { 3, 4, 3 }};PrintMatrix(matrix, "原矩阵");PrintMatrix(AdjointMatrix(matrix), "伴随矩阵");Console.WriteLine("⾏列式的值为:" + Determinant(matrix) + '\n'); PrintMatrix(InverseMatrix(matrix), "逆矩阵");Console.ReadLine();}4.执⾏结果希望本⽂所述对⼤家的C#程序设计有所帮助。
上三角矩阵的逆 c语言
![上三角矩阵的逆 c语言](https://img.taocdn.com/s3/m/98fa0aa64bfe04a1b0717fd5360cba1aa9118c50.png)
上三角矩阵的逆c语言全文共四篇示例,供读者参考第一篇示例:上三角矩阵是一种特殊的矩阵,其下三角部分全为零,只有对角线及其上方有非零元素。
在数学和计算机科学中,求解上三角矩阵的逆是一个非常重要的问题。
在本文中,我们将介绍使用C语言编程实现上三角矩阵的逆的方法。
上三角矩阵的逆可以通过追溯法来求解。
追溯法是一种基于矩阵的高斯消元法,通过多次矩阵变换来将原矩阵化为单位矩阵,最终得到原矩阵的逆矩阵。
在C语言中,我们可以通过编写一个函数来实现上三角矩阵的逆的计算。
我们需要定义一个二维数组来存储上三角矩阵,以及一个同样大小的二维数组来存储逆矩阵。
接着,我们可以编写一个函数来进行矩阵的逆的计算。
以下是一个示例代码:```c#include <stdio.h>#define SIZE 3 // 定义矩阵的大小// 函数原型声明void inverse_matrix(float matrix[SIZE][SIZE], float inverse[SIZE][SIZE]);float inverse[SIZE][SIZE]; // 定义一个用于存储逆矩阵的数组inverse_matrix(matrix, inverse); // 调用函数求解逆矩阵// 输出逆矩阵for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {printf("%f ", inverse[i][j]);}printf("\n");}return 0;}// 函数定义void inverse_matrix(float matrix[SIZE][SIZE], float inverse[SIZE][SIZE]) {for (int i = SIZE - 1; i >= 0; i--) {for (int j = 0; j < SIZE; j++) {if (i == j) {inverse[i][j] = 1 / matrix[i][j];} else {float sum = 0;for (int k = 0; k < SIZE; k++) {sum += matrix[i][k] * inverse[k][j];}inverse[i][j] = -sum / matrix[i][i];}}}}```在上面的代码中,我们定义了一个3x3的上三角矩阵,并在`inverse_matrix`函数中实现了逆矩阵的计算。
矩阵求逆c代码
![矩阵求逆c代码](https://img.taocdn.com/s3/m/90041a47fc4ffe473368abcd.png)
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 课程设计报告学院:班级:学号:学生姓名:指导教师:时间:课程设计任务书一、设计内容掌握矩阵求逆的概念的原理,以及矩阵求逆的计算。
编写程序完成矩阵求逆计算。
要处理的数据由自己选择。
二、主要技术指标(2)掌握矩阵求逆的概念的原理,以及矩阵求逆的计算。
(3)用C或者C++实现矩阵求逆(4)处理结果与Matlab求逆结果对比(5)阅读矩阵求逆方面文献10篇以上三、进度要求两周完成设计任务,写5000字以上的小论文。
附参考文献并在论文中进行标注。
学生指导教师1. 设计内容掌握矩阵求逆的概念的原理,以及矩阵求逆的计算。
编写程序完成矩阵求逆计算。
要处理的数据由自己选择。
2. 设计过程1、 矩阵的定义由n m ⨯个数ij a (1,2,,;1,2,,)i m j n =⋅⋅⋅=⋅⋅⋅排列成m 个行n 个列的数表 称为n m ⨯矩阵,其中数ij a 称为矩阵A 的),(j i 元. 当n m =时,称A 为n 阶矩阵或n 方阵.元素全为零的矩阵称为零矩阵,记作n m O ⨯或简记为O .两个矩阵n m ij a A ⨯=)(,t s ij b B ⨯=)(,如果s m =,t n =,则称矩阵A 与B 为同型矩阵.如果两个同型矩阵)(ij a A =与)(ij b B =的对应元素相等,即ij ij a b =,1,2,,i m ∀=⋅⋅⋅,1,2,,j n =⋅⋅⋅,则称矩阵A 与B 相等,记作B A =或n m ij n m ij b a ⨯⨯=)()(.[1]当1=m 时,矩阵),,,(21n a a a A ⋅⋅⋅=称为行矩阵或行向量.当1=n 时,,矩阵⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=m b b b A 21称为列矩阵或列向量.形如的n 阶方阵,即主对角线以外的元素都是零的方阵称为对角矩阵或对角方阵,记作1212(,,,)n n a a diag a a a a ⎡⎤⎢⎥⎢⎥Λ==⎢⎥⎢⎥⎣⎦. 特别当a a a a nn ==== 2211时,这时的对角矩阵叫做n 阶数量矩阵.当12211====nn a a a 时,这时的数量矩阵叫做n 阶单位矩阵,记作nE 或n I ,在阶数不致混淆时,简记为E 或I ,即⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=100010001 n I . 主对角线下方的元素都是零的方阵 叫做上三角矩阵.主对角线上方的元素都是零的方阵 叫做下三角矩阵.[2]2、逆矩阵的概念定义:设A 是数域P 上的一个n 阶方阵,如果存在P 上的n 阶方阵B ,使得AB = BA = E ,则称A 是可逆的,又称B 为A 的逆矩阵.当矩阵A 可逆时,逆矩阵由A 惟一确定,记为A -1. [3]2、矩阵的初等变换矩阵的初等行变换是指对矩阵进行下列三种变换: (1) 将矩阵中某两行对换位置; (2) 将某一行遍乘一个非零常数k ;(3) 将矩阵的某一行遍乘一个常数k 加至另一行.并称(1)为对换变换,称(2)为倍乘变换,称(3)为倍加变换.(4)矩阵A 经过初等行变换后变为B ,用A B 表示,并称矩阵B 与A 是等价的3 、有关矩阵求逆的定义定理定义1 n 级方阵A 称为可逆的,如果n 级方阵B ,使得 AB=BA=E (1) 这里E 是n 级单位矩阵。