用c语言将一般矩阵化为简化阶梯型

article/2025/9/16 18:58:45

(完整的程序附在文末)
1、问题描述:
用C/C++设计一个算法,把矩阵M化为行最简形梯形矩阵A。矩阵A应该满足以下几个条件:
1)若有零行,则零行应在最下方;
2)非零首元(即非零行的第一个不为零的元素)的列标号随行标号的增加而严格递增;
3)非零首元所在的列除了非零首元外,其余元素全为0;
4)非零首元都为1.
输入是一个文件input.txt
1)第一行会输入样本数k;
2)每个样本的第一行会输入n, m,表示矩阵M是nm维的;
3)接下来的n行里,每一行会输入m个元素,以空格隔开.
输出是一个文件output.txt
2)每个样本的第一行会输出n, m,表示最简形梯形矩阵A是n
m维的;
3)接下来的n行里,每一行会输出m个元素,以空格隔开.

2、算法流程:
依据题目描述,我们要写出一个能够依次处理多组数据的、能把任意矩阵化为简化阶梯形形式的程序。考虑到矩阵化为简化阶梯形的过程较为繁琐,所以把化简过程分为将矩阵化为阶梯型、将阶梯型化为简化阶梯型两部分。
1)txt文件的读入和输出的实现
在这里插入图片描述
2)实现多组数据的处理
为了使程序能处理多组数据,要用到计数循环,即:
(1) 输入要处理的数据有多少组,在我的程序中记为k;
(2) 定义并赋值k1=1,这里的k1表示正在处理第几组数据;
(3) 每处理完一组数据后,使得k1增加1;
(4) k1=k时处理完最后一组数据,此时k1再加1,即k1>1,跳出循环.
在这里插入图片描述
3)矩阵的输入
考虑到矩阵包含行和列,是一个二次数列的集合,采用数组记录矩阵会比较方便。这里记为a[m][n].
(1)输入数组的总行数m和总列数n;
(2)定义i、j分别表示当前讨论的数是在数组的第i行、第j列(在我的程序中还
定义了i2、j2等参数,即在i、j已经有特定的意义,表示第i行第j列时,进而分析第i2行、第j2列的数。总之,i表示行,j表示列);
(3)使i=1,开始一个循环,每次循环结束后i增加1,i>m后跳出循环。在这个循
环中使j=1,开始另一个循环,每次循环结束后j增加1,j>n后跳出循环.
(4)在上述循环中,依次从键盘读取a[i][j].
这样,我们就做到了从上往下、从左往右依次输入数字,使得数字在数组中的位置与在矩阵中的位置完全相同。
在这里插入图片描述
以一个3x3,从上往下、从左至右数字依次递增的矩阵为例,我们得到的数组的各个存储格存储的数据如下图:
在这里插入图片描述
在这里插入图片描述
4)将一般矩阵化为阶梯型
要想化矩阵为阶梯型,必须从左至右找到每个主元列中的主元,再用主元消去主元正下方的数。首先需要找主元,我采用了类似将矩阵各数字输入数组的类似的方法:用两个循环语句实现:从左至右逐列分析,分析每列时自上而下依次分析每个数字。
(1) 换行
主元位置的数不能为零,所以分析某一列的时候,我们自上而下找第一个不为零的数,让这个数存在的一行与含有该列的主元位置的那一行交换,即换行,这样一来就保证了主元位置不为0。
那么问题来了。若第一列已经处理好,我们要进行第二列的操作时,我们要从第二个数开始自上而下进行判断某个数是否为零。因为若这一列存在主元位置,必然是该列的第二个数。主元位置上方的排序已经完成,不能再动了。那么第三列呢?有两种情况:(a)若第二列找到了主元,第三列有主元位置的话必定是该列第三个;(b)若第二行没有主元,第三列有主元位置的话必定是从上往下数第二个。而我们要从主元位置开始自上而下找非零值,也就是说前面的非主元列会对之后的分析造成影响。经深入思考,我发现当判断到第j列时,用v代表第j列之前有多少非主元列,若第j列有主元,必然是该列第(j-v)个。
但是,我们并不知道某一列是否是主元列,如果不是,这一列不需要进行行交换。如何判断呢?我们自上而下找非零元素,若全部的数均为零,则该列为非主元列,此时v++,并用break跳出循环。
在这里插入图片描述
换行比较简单,我利用了一个新的数组b来临时存储数据。
在这里插入图片描述
(2)利用主元消除该列下方其他行元素
这里我一开始打算将各个主元化为1后再把该列其他数化为0,但是考虑到含有主元的行可能会出现小数,导致之后的处理出现偏差,最终还是决定放大各个数而不是缩小。假设我要用含有某个主元的一行消除第i行,第i行每个数乘以该主元,含有主元的一行乘以主元列中第i行的元素,两行相减赋给第i行。为了避免含主元的一行数据过大,我们在操作结束后除以原来乘的那个数。(因为数据会改变,一开始用一个变量s2来存储这个数。)之后用break跳出循环。
在这里插入图片描述
至此,我们将矩阵化为了阶梯型。
5)将阶梯型化为简化阶梯型
我们从最后一行开始向上逐行分析,每一行从左至右第一个非零元素必为主元。
在这里插入图片描述
将主元化为1,把主元上方的数全部化为0.当然,如果上面的数为零则不处理。
在这里,因为数据处理后会变动,这里利用v记录信息。v等不等于-1是用来记录该数是否为零的一个标准。至此,数据处理全部完成。
在这里插入图片描述
6)矩阵的输出。和输入类似,逐行、逐列输出。(保留三位小数)
在这里插入图片描述
3、实验结果
将一个input.txt文件放在与程序相同的文件夹下,运行程序,输出output.txt。
input.txt
output.txt
在数学里,将一个简单的矩阵化为简化阶梯型很简单,我们的思路也相当明确。但是,当我们要为程序设计一个算法,让程序自己能够用特定的方式解决问题时,却觉得相当的复杂。主元的寻找,一眼就能看出来的,但要让程序做到,不得不绞尽脑汁想出那几行代码。所以,我们要学会探究解决问题的方法的本质。很多显然的事在深究后并不是那么的“显然”,但是一旦我们发现了其中的原理,思想的理解上和之后解决问题的能力上就会有很大的飞越。
完整程序如下:

  #include<stdio.h>
int main(){int k,k1,m,n,i,j,i2,j2,i3,j3,v,s1,s2;float a[100][100],b[100][100];FILE *fpRead=fopen("input.txt","r");FILE *fpWrite=fopen("output.txt","w");if(fpRead== NULL){  return 0;  } fscanf(fpRead,"%d",&k);for(k1=1;k1<=k;k1++){fscanf(fpRead,"%d %d",&m,&n);for(i=1;i<=m;i++){for(j=1;j<=n;j++)fscanf(fpRead,"%f",&a[i][j]);}v=0;for(j=1;j<=n;j++){for(i=j-v;i<=m;i++){if(i== m&&a[i][j]== 0){v++;break;}else if(a[i][j]= =0)continue;else{for(j2=1;j2<=n;j2++){b[i][j2]=a[i][j2];a[i][j2]=a[j-v][j2];a[j-v][j2]=b[i][j2];}s1=a[j-v][j];for(i2=j-v+1;i2<=m;i2++){s2=a[i2][j];for(j2=1;j2<=n;j2++){if(s2==0)break;else{a[i2][j2]*=s1;a[j-v][j2]*=s2;a[i2][j2]-=a[j-v][j2];a[j-v][j2]/=s2;}}}break;}}}for(i=m;i>=1;i--){for(j=1;j<=n;j++){if(a[i][j]== 0)continue;else{s1=a[i][j];for(j2=j;j2<=n;j2++)a[i][j2]/=s1;for(i2=i-1;i2>=1;i2--){if(a[i2][j]!=0){s1=a[i2][j];v=-1;}if(v!=-1)s1=0;for(j2=j;j2<=n;j2++)a[i2][j2]=a[i2][j2]-a[i][j2]*s1;}break;}}} if(fpWrite== NULL){  return 0;  } if(k1== 1)fprintf(fpWrite,"%d\n",k);fprintf(fpWrite,"%d %d\n",m,n);for(i3=1;i3<=m;i3++){for(j3=1;j3<=n;j3++){if(a[i3][j3]==-0)a[i3][j3]=0;fprintf(fpWrite,"%.3f ",a[i3][j3]);}fprintf(fpWrite,"\n"); }}return 0;
}

http://chatgpt.dhexx.cn/article/PyTi1f0n.shtml

相关文章

矩阵的行简化阶梯型和标准型

矩阵的行简化阶梯型是一种很有用的与原矩阵等价的矩阵&#xff0c;包括有相同的秩,相同的零空间,以及可以用来求解线性方程组 1 阶梯型矩阵和行简化阶梯型矩阵 下面以上节的方程组开始做初等变换: 由方程组得到增广矩阵 &#xff1a; B 下边对B进行初等变换&#xff1a; B…

阶梯形矩阵(Echelon Matrix)

初等矩阵 定义&#xff1a;与单位矩阵只有微小差别的矩阵。具体来说&#xff0c;就是一个单位矩阵经过一次初等行变换或一次初等列变换后得到的矩阵。 初等变换有下面三种形式&#xff1a; 1&#xff0c;两行&#xff08;列&#xff09;互换 2&#xff0c;把某行&#xff08;…

如何将一个矩阵化为行阶梯形矩阵

2016-03-29 尾巴 线性代数 有同学反映上一课过于冷冰冰&#xff0c;都是一些不带证明的公式。如果线性代数所有公式都要证明的话&#xff0c;线性代数的难度会上好几个量级&#xff0c;有的公式的证明是特别特别难的。还有一个&#xff0c;虽然我们需要大家能对这门课有一些直观…

《线性代数》学习之———第一章 矩阵与方程组(1.2行阶梯形)

1.2行阶梯形矩阵 行阶梯形矩阵相关理论主要的应用还是针对矩阵的不同情况进行化简&#xff0c;因为有些矩阵在化简过程中会出现&#xff0c;系数矩阵的相关行等于0但是对应的增广矩阵相关行不等于0&#xff0c;使出现了违反常理的0实数的情况。 因此&#xff0c;就需要行阶梯形…

修改电脑网段

因为需要远程连接&#xff0c;把自己电脑网段修改一下。 控制面板-网络和Internet-网络连接“右键”-属性-IPv4-自行修改

OpenWrt修改IP网段

修改LAN的IP配置网段 修改此处即可

局域网同一个网段通信过程

局域网内同网段通信的过程 这个时候就需要用到ENSP模拟器了&#xff0c;之前已经安装好了&#xff0c;我们通过ENSP来搭建实验环境&#xff0c;这样可以看到实验的效果以及通过抓包来分享整个过程&#xff0c;先看同网段内的通信过程。 1、准备工作 2、开始测试 我们先用PC1访…

linux 跨网段ping,Linux中跨网段ping问题

问题是这样的&#xff0c;如图&#xff0c;pc的ip是192.168.1.2&#xff0c;设备是linux内核2.6.35&#xff0c;有两个网卡&#xff0c;一个是带外管理口192.168.1.1 一个是192.168.2.1。pc与设备的带外口也就是192.168.1.1相连 将pc的gateway设置为192.168.1.1 pc ping 192.16…

修改docker ip网段

一 问题描述 用docker方式安装完archery后&#xff0c;网络同事反馈该archery服务器的网段和现有网段冲突了&#xff0c;我在archery服务器上&#xff0c;的确发现docker自动生成了几个网卡&#xff1a; #查看docker使用的网卡 [rootArchery ~]# docker network ls NETWORK I…

批量ping网段

ping命令是我们检查网络中最常用的命令&#xff0c;一般常见的场景是去ping一个地址或三四个地址&#xff0c;三四个地址时分别去ping即可&#xff0c;如果碰到50个地址100地址甚至一整段地址&#xff0c;再去一个一个的ping就很麻烦了&#xff0c;我们可以使用一行命令实现批量…

linux服务器如何进入图形界面,linux进入图形界面的方法

安装有图形界面的情况下&#xff0c;启动linux在终端下输入: startx 即可进入X11的图形操作界面。 如果希望每次都自动进入xwindos。。 修改inittab文件。 vi /etc/inittab 找到id:3:initdefault:这行 按i进入编辑模式&#xff0c;将3改为5。 按esc退出编辑。 输入 &#xff1a…

Ubuntu安装图形界面

一、前言 今天更换阿里云操作系统&#xff0c;发现更换的Ubuntu操作系统没有图形界面&#xff0c;在这总结一下Ubuntu安装图形界面的方法&#xff01; 二、安装图形界面 1、依次执行如下命令行 sudo apt-get update sudo apt-get upgrade -y sudo apt-get install tasksel -…

c语言 图形界面 入门,C语言是怎么实现图形界面的?

GTK就可以,一个基于C语言的免费、开源、跨平台图形工具包,可以直接使用C语言调用实现图形界面开发,下面我简单介绍一下这个工具包的安装和使用,这里以Windows平台为例: 1.首先,下载GTK安装包,这个可以直接到CSDN上下载,一个zip压缩包,直接解压就行,地址https://downl…

wsl使用图形界面

WSL图形界面优势 为wsl安装图形界面之后&#xff0c;就像拥有一台新电脑一样。 wsl安装完毕后&#xff0c;与wsl子系统交互的方法只有shell&#xff0c;具有一些弊端&#xff1a; 1.学习难度大&#xff0c;交互式编程循环结构难以加入。 2.不支持GUI&#xff0c;对数据可视…

Git 图形界面

Git 图形界面的操作方式 我们可以通过 gitk 和 git-gui 2种方式进行图形化界面的操作。官网介绍比较笼统&#xff0c;我这里通过详细操作让您快速上手 git 图形界面。 gitk 进入我们的git仓库然后执行gitk即可 具体操作方式如下&#xff1a; 在git仓库目录右键点击Git Bash …

arch linux界面,ArchLinux图形界面安装

8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 说明 ArchLinux的wiki十分的强大,但是鉴于网上大多用户的安装教程十分的杂乱,就是把所有都装上,然后看见桌面出来了,就以为装好了,实际上没有理解或者认真阅读Arch wiki,我写这篇仅仅是为了记录…

centos 7 启动与切换图形界面

安装图形界面 默认情况下是不会安装图形界面的&#xff0c;所以需要自己手动安装&#xff0c;步骤如下&#xff1a; 开启系统&#xff0c;以root身份进入 安装X(X Window System)&#xff0c;命令如下&#xff1a; yum groupinstall "X Window System"其中大约有20…

GUI图形界面编程基础知识

文章目录 一、GDI概述二、OpenGL三、什么是DirectX?四、GDI与OpenGL与DirectX之间的区别五、显卡驱动1.显卡概述2.显卡工作原理 六、C图形化GUI开发框架1.MFC介绍1) API2) SDK3) 控制台程序4) GUI程序5) MFC程序6) 字符编码&#xff1a;Unicode和多字节 2.Qt是什么&#xff1f…

推荐给大学生的几个图形界面方案

现在计算机专业的大学生&#xff0c;经常要打各种软件设计比赛或者实验&#xff0c;而凡是参与比赛就会要求写个图形界面。但是&#xff0c;怎么写一个图形界面&#xff0c;在学校的课上基本不会讲&#xff01;因此&#xff0c;我在这里列出几个好用的图形界面方案&#xff0c;…

【新星计划·2023】Linux图形、字符界面介绍与区别

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将介绍图形界面与命令行界面以及它们的区别&#xff0c;登录方法。 目录 一、图形界面与命令行界面介绍 1、图形界面 2、命令行…