高斯消元法的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上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
随机推荐
- Javascript-- jQuery DOM篇(一)
DOM创建节点及节点属性 通过JavaScript可以很方便的获取DOM节点,从而进行一系列的DOM操作.但实际上一般开发者都习惯性的先定义好HTML结构,但这样就非常不灵活了. 浏览器提供的一些原生 ...
- linux命令学习笔记(9):touch 命令
linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. .命令格式: touch [选项]... 文件... .命令参数: -a 或--t ...
- 如何查看myeclipse是否激活
myEclipse---->Subscription information--->Subscription expiration date 看这个日期到什么时候!另外建议别用太高版本的M ...
- PS 滤镜— —Twirl Filter
clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...
- sws_scale函数的用法-具体应用
移植ffmpeg过程中,遇到swscale的用法问题,所以查到这篇文章.文章虽然已经过去很长时间,但是还有颇多可以借鉴之处.谢谢“咕咕鐘". 转自:http://guguclock.blog ...
- vue2.0中的$router 和 $route的区别
1.router是VueRouter的一个对象,通过Vue.use(VueRouter)和VueRouter构造函数得到一个router的实例对象,这个对象中是一个全局的对象,他包含了所有的路由包含了 ...
- vijos1779国王游戏
描述 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这n位大臣排成一排,国王站在队伍的最前面.排好队后, ...
- 二 Akka学习 - actor介绍
一个actorSystem 是一个重量级的结构.它会分配N个线程.所以对于每一个应用来说只用创建一个ActorSystem. Actor是种可怜的“生物”,它们不能独自存活.Akka中的每一个Acto ...
- 二 lambda表达式
1:lambda写的好可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类. 2: lambda表达式配合Java8新特性Stream API可以将业务功能通过函数式编程简洁的实现. 3: l ...
- 数组排序----Demo
//选择排序,分为简单选择排序.树形选择排序(锦标赛排序).堆排序 此算法为简单选择排序 public static void selectSort(int[] a){ for(int i=0;i&l ...