这个求逆矩阵matlab怎么求逆矩阵

1、矩阵的加减乘除求逆运算的概念:
  (1)矩阵概念
&&&&& 有m n个数排列成一个m行n 列,并括以方括弧(或圆括弧)的数表称为m行n 列矩阵。
  (2)矩阵加法:&
&  (3)矩阵乘法:
  (4)矩阵的求逆运算
  (5)矩阵的除法:
    分成两种(1)A\B=inverse(A)*B& (2)B/A=B*inverse(A),理解上可能有误,不过是按照这两种方式来运算的。。
  要求很简单:编写一个实现矩阵(向量)的+ - * / 求逆运算的类(女友的一个作业题)
3、实现代码
1 #include&stdio.h&
2 #include&stdlib.h&
3 #define col 3
4 #define row 3
5 class matrix//类的定义
7 private:
double m[col][row];//矩阵设置为私有的,
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();//显示函数声明
20 matrix::matrix(double a[col][row])//构造函数的定义
for(i=0;i&i++)
for(j=0;j&j++)
m[i][j]=a[i][j];
27 matrix matrix::Add(matrix &b)//加法运算
matrix*c=(matrix*)malloc(sizeof(matrix));
for(i=0;i&i++)
for(j=0;j&j++)
c-&m[i][j]=m[i][j]+b.m[i][j];
return(*c);
36 matrix matrix::Sub(matrix &b)//减法运算
matrix*c=(matrix*)malloc(sizeof(matrix));
for(i=0;i&i++)
for(j=0;j&j++)
c-&m[i][j]=m[i][j]-b.m[i][j];
return *c;
45 matrix matrix::Mul(matrix &b)//乘法运算
int i,j,k;
double sum=0;
matrix*c=(matrix*)malloc(sizeof(matrix));
for(i=0;i&i++)
for(j=0;j&j++)
for(k=0;k&k++)
sum+=m[i][k]*(b.m[k][j]);
c-&m[i][j]=
return(*c);
62 matrix matrix::Div(matrix &b)//除法运算
//除法直接求解,参见主函数
return(c);
68 matrix matrix::Inverse()//求逆运算
//参考博客:/rollenholt/articles/2050662.html
int i,j,k,M=col,N=2*
double b[col][col*2];
matrix*c=(matrix*)malloc(sizeof(matrix));
for(i=0;i&M;i++)
for(j=0;j&M;j++)
b[i][j]=m[i][j];
for(i=0;i&M;i++)
for(j=M;j&N;j++)
if(i==(j-M))
b[i][j]=1;
b[i][j]=0;
/***************下面进行求逆运算*********/
for(i=0;i&M;i++)
if(b[i][i]==0)
for(k=i;k&M;k++)
if(b[k][i]!=0)
//作者的博客里面此处为b[k][k],貌似是不正确的,
//因为这对比如说是{0,0,1,1,0,1,0,1,1}的矩阵就会判断为不可逆,
//而实际上该矩阵是可逆的,这里应该是作者笔误,待进一步求证
for(int j=0;j&N;j++)
temp=b[i][j];
b[i][j]=b[k][j];
printf("该矩阵不可逆!\n");
for(j=N-1;j&=i;j--)
b[i][j]/=b[i][i];
for(k=0;k&M;k++)
double temp=b[k][i];
for(j=0;j&N;j++)
b[k][j]-=temp*b[i][j];
/**********************导出结果******************/
for(i=0;i&M;i++)
for(j=3;j&N;j++)
c-&m[i][j-3]=b[i][j];
return (*c);
130 matrix::~matrix()
132 void matrix::display()
for(i=0;i&i++)
for(j=0;j&j++)
printf("%f
",m[i][j]);
printf("\n");
142 void main()
double a[3][3]={{1,0,1},{0,1,1},{0,3,1}};
double b[3][3]={{0,0,1},{1,0,1},{0,1,0}};
matrix ma(a),mb(b),
printf("----------------------------------------------------\n请选择要进行的操作:\n1、打印\t2、加法");
printf("\t3、减法\n4、乘法\t5、除法\t6、求逆\n7、退出\n");
printf("-----------------------------------------------------\n");
scanf("%d",&flag);
while((flag==1)||(flag==2)||(flag==3)||(flag==4)||(flag==5)||(flag==6)||(flag==7))
if(flag==1)
printf("矩阵a为:\n");
ma.display();
printf("矩阵b为:\n");
mb.display();
if(flag==2)//矩阵加法运算
printf("矩阵加法运算结果:\n");
mc=ma.Add(mb);
mc.display();
else if(flag==3)//矩阵减法运算
printf("矩阵减法运算结果:\n");
mc=ma.Sub(mb);
mc.display();
else if(flag==4)//矩阵乘法运算
printf("矩阵乘法运算结果:\n");
mc=ma.Mul(mb);
mc.display();
else if(flag==5)//矩阵除法运算
printf("矩阵除法运算结果:\n");
printf("矩阵的除法分成两类:\n 1、A\\B=inverse(A)*B \n 2、B/A=B*inverse(A)\n");
printf("采用第1类,则a\\b的结果为:\n");
mc=ma.Inverse();
mc=mc.Mul(mb);
mc.display();
printf("采用第2类,则a/b的结果为:\n");
mc=mb.Inverse();
mc=ma.Mul(mc);
mc.display();
else if (flag==6)//矩阵求逆运算
printf("矩阵a求逆运算结果为:\n");
mc=ma.Inverse();
mc.display();
printf("矩阵b求逆运算结果为:\n");
mc=mb.Inverse();
mc.display();
else {exit(0);}
printf("----------------------------------------------------\n请选择要进行的操作:\n1、打印\t2、加法");
printf("\t3、减法\n4、乘法\t5、除法\t6、求逆\n7、退出\n");
printf("-----------------------------------------------------\n");
scanf("%d",&flag);
4、参考:  (1)c编程,谭浩强
  (2)博客:
阅读(...) 评论()用Casio fx-991es求逆矩阵及矩阵乘法——多元线性回归的参数不用自己算了:-)
mode&6 进入矩阵模式 接下来按一下AC讲画面清零 接下来 shift&4进入矩阵模式下的选项,按1 dimension.选择要定义的矩阵变量,例如matA,之后选择维数,输入矩阵元素 下面调出matA:shift&4&3 matA已显示在屏幕上了,接下来按x-1(在log上方)就会出现matA^(-1)了,按等号,逆矩阵就出来了。 当matA在屏幕上以后,如果你还定义了matB,那就把matB也调出,中间放个乘号,点等号就有了乘法结果了。
分享这篇日志的人也喜欢
早起傻好几天?
上课偷偷播
我的MC大哥呢
今天穿的跟熊似的。
新人求关注
大学生创业规划课
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场C#计算矩阵的逆矩阵方法实例分析
作者:北风其凉
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了C#计算矩阵的逆矩阵方法,较为详细的分析了逆矩阵的计算原理与相关的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.L
for (int counter = 0; counter & matrix.L 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.L i++)
for (int j = 0; j & matrix.L j++)
result[i][j] = result[i][j] / dD
/// &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.L 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.L j++)
for (int k = 0; k & matrixTemp.L k++)
matrixTemp[j][k] = matrix[j + 1][k &= i ? k + 1 : k];
dSum += (matrix[0][i] * dSign * Determinant(matrixTemp));
dSign = dSign * -1;
/// &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.L i++)
result[i] = new double[matrix[i].Length];
//生成伴随矩阵
for (int i = 0; i & result.L i++)
for (int j = 0; j & result.L 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.L x++)
for (int y = 0; y & temp.L 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);
/// &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.L i++)
for (int j = 0; j & matrix[i].L j++)
Console.Write(matrix[i][j] + "\t");
//注意不能写为:Console.Write(matrix[i][j] + '\t');
Console.WriteLine();
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#程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 三矩阵的逆矩阵怎么求 的文章

 

随机推荐