资源简介
在做TPS时用到了两种矩阵求逆的方法,都是适合大型矩阵求逆的方法,一个是高斯约旦法,还有是依照大一线性代数中的增广矩阵法求解,复杂度都是n的三次方。

代码片段和文件信息
#include “matrix_diy.h“
using namespace std;
double ** muti(double **Mint M_rowint M_coldouble **Nint N_rowint N_col)//矩阵乘法
{
double **ans;
ans=new double *[M_col]; //分配空间
for(int i=0;i ans[i]=new double[N_row];
if(M_row!=N_col) //出错
return NULL;
for(int i=0;i {
for(int j=0;j {
ans[i][j]=0;//初始化
for(int k=0;k ans[i][j]+=M[i][k]*N[k][j];
}
}
}
return(ans);
}
double **T(double **Mint M_rowint M_col)//矩阵转置
{
double **ans;
ans=new double *[M_row]; //分配空间
for(int i=0;i ans[i]=new double[M_col];
for(int i=0;i for(int j=0;j ans[i][j]=M[j][i];
return (ans);
}
double **inverse1(double **M1int M1_col)//矩阵的逆用增广矩阵求解
{
int n=M1_col;
double**ans; //为结果分配空间,作为返回值
ans=new double *[n];
for(int i=0;i ans[i]=new double[n];
double**M; //为结果分配空间,作为中间值
M=new double *[n];
for(int i=0;i M[i]=new double[2*n]; //增广矩阵
for(int i=0;i {
for(int j=0;j {
M[i][j]=M1[i][j];
}
for(int j=n;j<2*n;j++)
{
if(i==j-n)M[i][j]=1;
else M[i][j]=0;
}
}
int flag1=0;
int flag2=0;
for(int k=0;k {
if(M[k][k]==0.0) //零
{
for(int s=k+1;s {
if(M[s][k]==0.0)continue;
else
{// 找到不为零的数
flag2=s;
double tmp=0;
//和该行做行交换
for(int j=k;j<2*n;j++)
{
tmp=M[k][j];
M[k][j]=M[flag2][j];
M[flag2][j]=tmp;
}
break;
}
}
if(M[k][k]==0.0)continue;
}
if(fabs(M[k][k])==0.0) //近似于零
cout<<“ERROR“<<“奇异“< for(int i=k+1;i {
double q=M[i][k]/M[k][k];
for(int j=k;j<2*n;j++)
M[i][j]=M[i][j]-M[k][j]*q; // 先变成上三角矩阵
for(int j=0;j {
if(fabs(M[i][j])<1e-10) //过小则近似于0
M[i][j]=0;
}
}
}
for(int k=n-1;k>0;k--)
{
if(M[k][k]==0.0) //主元为零
{
for(int s=k-1;s>0;s--)
{
if(M[s][k]!=0.0)
{// 找到不为零的数
flag1=s;
double tmp=0;
//和该行做行交换
for(int j=0;j<2*n;j++)
{
tmp=M[k][j];
M[k][j]=M[flag1][j];
M[flag1][j]=tmp;
}
break;
}
}
if(fabs(M[k][k])==0.0)continue;
}
for(int i=k-1;i>=0;i--)
{
double q=M[i][k]/M[k][k];
for(int j=k;j<2*n;j++)
M[i][j]=M[i][j]-M[k][j]*q; // 再变成全是主元的矩阵
for(int j=0;j {
if(fabs(M[i][j])<1e-10) //过小则近似于0
M[i][j]=0;
}
}
}
for(int i=0;i {
double ik=M[i][i];
for(int j=0;j<2*n;j++)
M[i][j]=M[i][j]/ik; //左边的矩阵变成I矩阵了,则右边的矩阵即为逆
}
for(int i=0;i for(int j=0;j ans[i][j]=M[i][j+n];
for (int i=0;i
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 377 2018-11-12 20:25 matrix_diy.h
文件 5822 2018-11-20 21:06 matrix_diy.cpp
- 上一篇:STM32F412工程模板
- 下一篇:Gojs设备线路高亮Demo
相关资源
- 旋转矩阵求欧拉角的简单算法
- 电梯模拟程序C/C 算法实现
- linux系统的二级文件系统(QT实现了简
- VS开发进阶源码---烟花特效的生日祝福
- 路由分组转发仿真系统的设计与实现
- DSPC6000 CCS矩阵求逆
- Bonjour SDK for Windows
- 《深入理解计算机系统》随书代码
- 炫彩界面库帮助文档chm-v2.5.0
- 嵌入式华清远见培训 ARM代码内部资料
- 2/3FEC编码
- 精简版黑白棋demo-Qt
- 线性表的基本操作vs2017
- 基于Qt5的俄罗斯方块游戏
- WS2812库 arduino测试通过
- VC全景图拼接算法源码毕业设计+论文
- 超市信息管理系统课程设计.docx
- zlib动态链接库x86&64;
- vc做的小游戏 —— 彩色泡泡
- linux+QT下基于RTP协议的实时视频传输客
- cmake-3.17.2-win64-x64.zip
- C用Easyx图形库编写贪吃蛇.zip
- 图像细化算法
- 北斗模块GPS定位显示
- 西电-面向对象课件褚华老师所著
- 张贤达--矩阵分析与应用
- gsl-2.6.7z
- 《编译原理第二版》完整版
- vim配置成强大的IDE
- K66_逐飞.zip
评论
共有 条评论