高斯消元法的C++简单实现
高斯消元法
首先,我们导入几个概念。
定义1: 一个矩阵称为阶梯形(行阶梯形),若它有以下三个性质:
1.每一非零行在每一零行之上;
2.某一行的先导元素所在的列位于前一行先导元素的后面;
3.某一行先导元素所在列下方元素都是零。
比如,
定义2:若一个阶梯形矩阵还满足以下性质,称它为简化阶梯形(简化行阶梯形):
1.每一非零行的先导元素是1;
2.每一先导元素1是该元素所在列的惟一非零元素。
比如,
定理1:每个矩阵行等价于惟一的简化阶梯形矩阵。即简化阶梯形矩阵是惟一的。
下面,我们用一个具体例子来说明高斯消元法的主要步骤。
原矩阵:
第一步,由最左的非零列开始,这是一个主元列。主元位置在该列顶端。

第二步,在主元列中选取一个非零元作为主元。若有必要的话,对换两行使这个元素移到主元位置上。

第三步,用倍加行变换将主元下面的元素变成0.

第四步,暂时不管包含主元位置的行以及它上面的各行,对剩下的子矩阵使用上述的三个步骤直到没有非零行需要处理为止。
对每一行重复上述步骤。



第五步,由最右面的主元开始,把每个主元上方的各元素变成0.若某个主元不是1,用倍乘变换将它变成1.




最后,我们就得到了原矩阵的简化阶梯形。
其中,第1~4步称为行化简算法的向前步骤,产生唯一的简化阶梯形的第5步,称为向后步骤。
C++实现
我们尝试用C++来实现以上步骤。这里只是简单的实现,也就是用代码描述了上述步骤,没有考虑过多的问题。欢迎大家在评论里指出问题,提出更好的建议,以便于日后改进。
大概的实现思路就是先实现向前步骤:
首先,我们对于每一行找到第一个不为零的元素,并且将这一行置为1 * * * *的形式,用这一行乘上倍数加到之后的每一行。
再实现向后步骤:
然后,我们从最后一行开始,选择主元,加到之前的每一行上,使得该列的元素都为零。
最后,我们就完成了化简,得到了简化阶梯形。
以上算法只是一个粗略实现,主要体现在:
1.对于主元的选定不够最优;
2.会出现精度问题;
3.对于某些情况无法处理。
先暂时贴上代码,之后有时间再进行优化。
#include <iostream>
#include <cstdio> using namespace std; int main()
{
double martix[][];
int n, m; // n行m列 scanf("%d %d", &n, &m); // 输入
for(int i = ; i < n; i++)
for(int j = ; j < m; j++)
scanf("%lf", &martix[i][j]); // 向前步骤
for(int i = ; i < n - ; i++)
{
// 找主元
int pos = ;
for(int j = ; j < m; j++)
if(martix[i][j])
{
pos = j;
break;
} if(martix[i][pos] != && martix[i][pos] != )
{
double tmp = martix[i][pos];
for(int j = pos; j < m; j++)
{
martix[i][j] = martix[i][j] / tmp;
}
}
for(int j = i + ; j < n; j++)
{
if(!martix[j][pos])
continue;
double tmp = martix[j][pos];
for(int k = pos; k < m; k++)
{
martix[j][k] = martix[j][k] - martix[i][k] * tmp;
}
}
} // 向后步骤
for(int i = n - ; i > ; i--)
{
int pos = ;
for(int j = ; j < m; j++)
if(martix[i][j])
{
pos = j;
break;
} if(martix[i][pos] != && martix[i][pos] != )
{
double tmp = martix[i][pos];
for(int j = pos; j < m; j++)
{
martix[i][j] = martix[i][j] / tmp;
}
} for(int j = ; j < i; j++)
{
if(!martix[j][pos])
continue;
double tmp = martix[j][pos];
for(int k = pos; k < m; k++)
{
martix[j][k] = martix[j][k] - martix[i][k] * tmp;
}
}
} // 输出
for(int i = ; i < n; i++)
{
for(int j = ; j < m; j++)
printf("%-10.2f", martix[i][j]);
printf("\n");
}
return ;
}
高斯消元法的C++简单实现的更多相关文章
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ1222 高斯消元法解抑或方程
第一次学怎么用高斯消元法解抑或方程组,思想其实很简单,方法可以看下面的链接:http://blog.csdn.net/zhuichao001/article/details/5440843 有了这种思 ...
- 高斯消元法(Gauss Elimination)【超详解&模板】
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...
- Eigen学习之简单线性方程与矩阵分解
Eigen提供了解线性方程的计算方法,包括LU分解法,QR分解法,SVD(奇异值分解).特征值分解等.对于一般形式如下的线性系统: 解决上述方程的方式一般是将矩阵A进行分解,当然最基本的方法是高斯消元 ...
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- Fabio 安装和简单使用
Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- 在Openfire上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
随机推荐
- Statement
题目大意 给定一棵基环外向树,和若干组询问,对于每次独立的询问都指定一些起点和一些终点,你删去一些边,使得从任意起点出发都无法到达终点,并让删去的边的编号的最小值最大,求这个最大的最小值. 题解 不难 ...
- SPOJ Query on a tree III (树剖(dfs序)+主席树 || Splay等平衡树)(询问点)
You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose ...
- BZOJ5314: [Jsoi2018]潜入行动
BZOJ5314: [Jsoi2018]潜入行动 https://lydsy.com/JudgeOnline/problem.php?id=5314 分析: 裸树形背包,设\(f[x][i][0/1] ...
- Popular Cows
传送门(poj):http://poj.org/problem?id=2186 (bzoj):http://www.lydsy.com/JudgeOnline/problem.php?id=1051 ...
- Unity中的ShaderToys——将大神们写的shader搬到unity中来吧
http://lib.csdn.net/article/unity3d/38699 这篇文章翻译自国外的一篇文章(这里是原文链接),正在使用unity的你是否在shader toy上发现很多牛逼哄哄的 ...
- Guice总结
Guice总结 Jar包:guice-4.1.0.jar 辅包: guava-15.0.jar aopalliance-.jar javaee-api-6.0-RC2.jar Guice的IoC 两种 ...
- 洛谷 P4220 & UOJ #347 通道 —— 随机化
题目:https://www.luogu.org/problemnew/show/P4220 http://uoj.ac/problem/347 先写了一下 n^2 和三棵树一样的情况,n^2 还写了 ...
- grep的用法(转)
grep参数 -c : 显示匹配的行数(就是显示有多少行匹配了): -n :显示匹配内容所在文档的行号: -i :匹配时忽略大小写: -s :错误信息不输出: -v :输出不匹配内容: -o : ...
- nginx用cookie控制访问权限实现方法
自己的一个需求需要对a.b.com 下的 /c 这个目录下,cookie d=e 才能访问,如果不是,就重定向到f.html 下面看代码. 代码如下 复制代码 server{ serve ...
- DCloud-MUI:Hello mui
ylbtech-DCloud-MUI:Hello mui MUI-最接近原生App体验的前端框架 1. 返回顶部 1. MUI-最接近原生App体验的前端框架 极小 100k的js文件,60k的css ...