求逆矩阵的问题(C语言代码)
keil逆矩阵编程 -回复

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语言实现

#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语⾔计算逆矩阵花了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++求矩阵的逆程序代码

求解逆矩阵源代码:#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++代码按照算法导论上矩阵求逆的原理,写了个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语言求矩阵的逆矩阵班级:自动化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语言全文共四篇示例,供读者参考第一篇示例:上三角矩阵是指所有主对角线以下的元素都为零的矩阵。
在数学和计算机科学领域中,上三角矩阵是一种常见的矩阵类型,在矩阵运算和线性代数中有着重要的应用。
在本文中,我们将探讨上三角矩阵的逆的计算方法,并使用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语言实现矩阵的加减乘除求逆运算

#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。