昨天学习了线性代数的行最简矩阵的计算方法,思路比较简单,但是做起来比较的麻烦,因此,我查阅了一些资料,编写了一个用C++实现的代码;代码本人已经写好了详细的注释,并且在VS2015编译运行成功,大家可以放心阅读;

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"
#include<math.h>
#include<stdlib.h>
//定义两个宏,M代表矩阵的行数,N代表矩阵的列数
#define M 4
#define N 4
using namespace std;
//flag数组起到标识作用,用来标识某列的数据是否为0,若flag[n]=0,则该列不为0
int flag[M];
int count1[M];//用来存储3行从开头起所具有的数据为0 的元素的个数
//输出矩阵的函数
void print(float(*a)[N])//以下参数都是用float类型,适应范围更广
{int i, j;for (i = 0; i < M; i++) //二层循环打印{for (j = 0; j < N; j++){if (fabs(a[i][j]) < 0.000001) //先判断是否为零a[i][j] = 0;cout << a[i][j] << "   ";}cout << endl;  //一整行打印完,回车,打印下一行}
}
//统计矩阵每行从开头起所具有的连续为0的元素的个数并赋给数组count1,例如0 1 2 0 4,则统计出来为1;void statistics(float(*a)[N])
{int i = 0, j = 0;for (i = 0; i<M; i++) //一层的行循环{int n = 0;for (j = 0; j<M; j++)  //二层列循环if (fabs(a[i][j])<0.000001){n++;count1[i] = n;  //若为零,则计数器加一并赋值给数组count1相应元素}else{count1[i] = n;break;}}
}//交换两行的数据的函数
void exchange(float a[], float b[])
{float t;//定义临时变量交换数据for (int i = 0; i<N; i++){t = a[i];a[i] = b[i];b[i] = t;}
}
//使某个数据变为1
void change1(float a[], float b)
{for (int i = 0; i<N; i++)a[i] /= b;
}
//判定某列的数据是否为0,并将1或0赋给数组flag[];
void judgement(float *p)
{for (int i = 0; i<M; i++)if (fabs(p[N*i])<0.000001)flag[i] = 0;elseflag[i] = 1;
}
//b行的数据减去a行的数据与b行该列数据的乘积,将所得的差值再依次赋给b行的数据
void subtraction(float a[], float b[], float rb)
{for (int i = 0; i<N; i++)b[i] = b[i] - a[i] * rb;
}
int main()
{cout <<"请输入一个" << M << "行" << N << "列的矩阵:" << endl;float Matrix[M][N];int i = 0, j = 0;//初始化赋值for (i = 0; i<M; i++)for (j = 0; j<N; j++)cin >> Matrix[i][j];cout << "The original matrix:" << endl;print(Matrix);cout << endl;//核心部分代码for (j = 0; j<N; j++){//统计每行从开头起所具有的数据为0的元素的个数并赋给数组count1statistics(Matrix);/*将从行开头起所具有的连续为0的元素多的行放到矩阵的下部,利用了选择排序法的思想,先找到最小值,再与首元素交换,该方法在一定程度上减少了交换次数,提高了程序的运行效率;*/for (int h = 0; h<M - 1; h++){int min = count1[h], tag = h;for (int k = h + 1; k <= M - 1; k++)if (min>count1[k]){min = count1[k];tag = k;}exchange(*(Matrix + h), *(Matrix + tag));}//行交换后重新统计每行从开头起所连续具有的数据为0的元素的个数并赋给数组count1statistics(Matrix);cout << endl;//判定第j列的数据是否为0,并将1或0赋给flag数组judgement(*Matrix + j);//如果本行前面的数据均为0即count[k]==j(或者该列为第首列)且本行该列的数据不为0,则将该行进行置1运算for (int k = 0; k<M; k++)if ((j == 0 || count1[k] == j) && (flag[k] == 1))change1(*(Matrix + k), Matrix[k][j]);//满足上述条件就将第k行均除以Matrix[k][j],进行置1运算;//用来label标记使得其他行变为0的辅助基本行的行号,该行前面的元素为0,该列上的元素为1int label = -1;for (int k1 = 0; k1<M; k1++)//判断条件表示:如果本行前面的数据均为0即count[k]==j(或者该列为第首列)且本行该列的数据不为0if ((j == 0 || count1[k1] == j) && (flag[k1] == 1)){label = k1;break;}if (label != -1){for (int k2 = 0; k2<M; k2++)if ((k2 != label) && (flag[k2] == 1))subtraction(Matrix[label], Matrix[k2], Matrix[k2][j]);}}cout << "原矩阵的行最简型矩阵是:" << endl;print(Matrix);cout << endl;system("pause");return 0;
}

程序运行实例如下:

备注:该程序有一定的局限性,不能动态的输入程序参数,只能修改程序源码中定义的宏来达到目的;

语法层面:这个是由于C/C++数组为静态数组,即编译时就会给数组分配内存,这时候数组长度就算是已经赋值的变量,编译器也会傲娇的报错;
要想实现动态数组需要用指针,过程比较繁琐,网上有许多方法,可以自行借鉴参考。

对于编译器层面,各种编译器都能很好地支持 C89 标准,但对 C99 的支持却不同:开源组织的 GCC 和 Xcode 使用的 LLVM/Clang 已经支持了大部分(几乎全部)的 C99 标准,而微软的 VC、VS 对 C99 却不感兴趣,直到后来的 VS2013、VS2015、VS2017 才慢慢支持,而且支持得还不好。

  1. 在 C89 中,必须使用常量表达式指明数组长度;也就是说,数组长度中不能包含变量,不管该变量有没有初始化。
  2. 而在 C99 中,可以使用变量指明数组长度。比如:
int m;
cin>>m;
int n[m];

上面代码使用变量指明数组长度,在 GCC 和 Xcode 下能够编译通过,而在 VC 和 VS(包括 VC 6.0、VS2010、VS2013、VS2015、VS2017 等)下都会报错。

个人想法:
程序输入不太方便,每次都要手动输入矩阵的值;
进而产生的想法是:可否调用接口识别矩阵图片,并将其识别出的数字按矩阵的顺序依次传入参数;可否调用语音识别接口直接将人说的矩阵值依次识别,并传入参数;目前本人实力实在有限,不能实现上述智能化功能,只是有了进一步完善程序的思路与想法。大家有建议的可以提一提,一起进步!望共勉!

参考博客:孙群大佬的博客

C++实现行最简型矩阵相关推荐

  1. C语言求矩阵行最简型及其秩

    /*注意:re == row_element;ce == column_element*/ #include <stdio.h> #include <math.h> void ...

  2. 行阶梯型矩阵,行最简形矩阵,标准形矩阵

    行阶梯形矩阵: 行最简形矩阵: 标准形矩阵:

  3. 矩阵化为最简型矩阵JAVA语言实现――线性代数

    目录 文章目录 前言 一.输入矩阵的信息 二.矩阵的初始处理 三.矩阵的进一步处理 四.显示最终结果 五.代码使用过程 六.整体代码 总结 文章目录 文章目录 前言 一.输入矩阵的信息 二.矩阵的初始 ...

  4. 两个分数化简比怎么化_怎么化行最简形矩阵?

    同学们,大家好 今天是5月12日,星期二,国际护士节 距离21考研还有221天 有的同学问: 怎么化行最简形矩阵? 有没有什么窍门? 其实没什么窍门儿 就是按着常规的方法 大家先由上往下 把这个矩阵化 ...

  5. 转置矩阵: 正交矩阵: 阶梯形矩阵 行简化阶梯形矩阵 行最简形矩阵 伴随矩阵的列排问题: 求二阶伴随矩阵简单例子

    目录 转置矩阵: 正交矩阵: 阶梯形矩阵 行简化阶梯形矩阵 行最简形矩阵

  6. 【概念记录】什么是 行最简形 矩阵?

    目录 复习使用:什么是 行最简形 矩阵? 再来看看例子 复习使用:什么是 行最简形 矩阵? 什么是 行最简形矩阵?举个例子? 再来看看例子

  7. 把矩阵化成行最简型(伪)

    三种初等行变换 因为最后显示出来矩阵行还是乱的(雾 所以是伪 但是俺觉得已经不影响使用了呢(笑 输入: 行数 列数 矩阵 #include<iostream> #include<al ...

  8. 矩阵化为行最简形矩阵计算器_[内附完整源码和文档] 基于C++的小型特殊计算器...

    1.设计内容 实现一个特殊的计算器,可以实现复数.有理数.矩阵和集合的特殊计算.程序可以实现复数.有理数的加.减.乘.除,可以实现矩阵的加法.减法和乘法运算,也可以实现集合的求交集.并集.子集的运算. ...

  9. matlab将矩阵化为行最简形

    化行最简形 本代码为个人原创 用基础函数写了一个matlab脚本将矩阵变成行最简式. 本代码未参考matlab自带的rref函数,完全手写 大致思路:把矩阵含有0的行放在最下面,然后下面的行减去上面的 ...

最新文章

  1. Django之Form组件
  2. vue-cli 搭建vue项目
  3. MacOS系统自带截图快捷键
  4. [CMake] 配置 install 和 uninstall
  5. [转] VR-FORCES 介绍
  6. 超级详细的SIMATIC STEP7 V5.5安装
  7. PyCharm安装LabelImg
  8. 计算机如何删除用户密码,怎么清除电脑开机密码
  9. matlab 开普勒方程,第二章 开普勒方程.ppt
  10. centos安装包安装最新版nginx
  11. 0006-Flink原理(Flink数据流 执行图)
  12. 01-初识sketch-sketch优势
  13. 云之道知识付费3.1.1【最新开源】全插件,独立版
  14. Python 批量创建线程及threading.Thread类的常用函数及方法
  15. lisp成套电气设计_电气工程制图课程设计.pdf
  16. 对信道估计和信道均衡的理解
  17. 把苹果全家桶用于VR全身追踪是什么体验
  18. Tomcat集群应用同步 —— 源码分析
  19. 成绩分析系统c语言实验报告,学生成绩管理系统实验报告
  20. python基础list_python基础学习之列表list

热门文章

  1. 红黑树是什么?红黑树的作用?红黑树的调整?
  2. 采样频率、采样点数、分辨率、谱线数
  3. 【转】osg中漫游器的原理
  4. 在网页上显示黑客帝国字幕效果
  5. Cow Hurdles
  6. 《移动云计算应用开发入门经典》书评
  7. Lenovo Ideapad S205 安装 fedora 16 失败
  8. kangle php插件,kangle php安装redis扩展
  9. java-php-python-ssm校园教务系统登录2021计算机毕业设计
  10. UI设计师的市场需求怎样