求解矩阵的最简行矩阵的C++程序代码

2024-02-19 19:38

本文主要是介绍求解矩阵的最简行矩阵的C++程序代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include<iostream.h>
#include<math.h>
const int M=3,N=4;//M代表矩阵的行数,N代表矩阵的列数
int num[M];//num数组中只存储0或1,用来标识某列的数据是否为0
int count[M];//用来存储3行从开头起所具有的数据为0 的元素的个数
void print(float (*a)[N]);//输出矩阵
void statistic(float (*a)[N]);//统计每行从开头起所具有的数据为0的元素的个数并赋给数组count 
void exchange(float a[],float b[]);//交换两行的数据
void multiply(float a[],float b);//使某个数据变为1
void judge(float *p);//判定某列的数据是否为0,并将1或0赋给数组num
void minus(float a[],float b[],float Rb);//b行的数据减去a行的数据与b行该列数据的乘积,将所得的差值再依次赋给b行的数据
void main()
{cout<<"注:"<<endl<<"由于C++不允许动态输入数据,所以不能从终端输入矩阵的行数和列数,此源程序默认的行数为"<<M<<",列数为"<<N<<",如需改动行数与列数,可在源程序第三行改变M和N的值即可"<<endl;cout<<endl<<"请输入一个"<<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++)//函数重点部分
{statistic(Matrix);//统计每行从开头起所具有的数据为0的元素的个数并赋给数组countfor(int h=0;h<M-1;h++)//将从行开头起所具有的连续为0的元素多的行放到矩阵的下部,利用了选择排序法的思想,先找到最小值,再与首元素交换{int min=count[h],tag=h;for(int k=h+1;k<=M-1;k++)if(min>count[k]){min=count[k];tag=k;}exchange(*(Matrix+h),*(Matrix+tag));  }statistic(Matrix);//行交换后重新统计每行从开头起所具有的数据为0的元素的个数并赋给数组countcout<<endl;judge(*Matrix+j);//判定第j列的数据是否为0,并将1或0赋给num数组for(int k=0;k<M;k++)//如果本行前面的数据均为0即count[k]==j(或者该列为第首列)且本行该列的数据不为0,则将该进行行置1运算if((j==0||count[k]==j)&&(num[k]==1))multiply(*(Matrix+k),Matrix[k][j]);//满足上述条件就将第k行均除以Matrix[k][j],进行置1运算cout<<"对满足一定条件的行进行置1运算后的矩阵:"<<endl;int label=-1;//用来label标记使得其他行变为0的辅助基本行的行号,该行前面的元素为0,该列上的元素为1for(int k1=0;k1<M;k1++)if((j==0||count[k1]==j)&&(num[k1]==1))//如果本行前面的数据均为0即count[k]==j(或者该列为第首列)且本行该列的数据不为0{label=k1;break;}if(label!=-1){for(int k2=0;k2<M;k2++)if((k2!=label)&&(num[k2]==1))minus(Matrix[label],Matrix[k2],Matrix[k2][j]);     }
}
cout<<"原矩阵的最简行矩阵是:"<<endl;
print(Matrix);
}
//调用函数的具体实现
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;} 
}
void multiply(float a[],float b)//使某个数据变为1
{ for(int i=0;i<N;i++)a[i]/=b;
}
void print(float (*a)[N])//输出矩阵
{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]<<"   ";if(j==N-1)cout<<endl;}
}
void statistic(float (*a)[N])//统计每行从开头起所具有的数据为0的元素的个数并赋给数组count
{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++;count[i]=n;}else{count[i]=n;break;}}
}
void judge(float *p)//判定某列的数据是否为0,并将1或0赋给数组num
{for(int i=0;i<M;i++)if(fabs(p[N*i])<0.000001)  num[i]=0;  else  num[i]=1;  
}
void minus(float a[],float b[],float Rb)//b行的数据减去a行的数据与b行该列数据的乘积,将所得的差值再依次赋给b行的数据
{for(int i=0;i<N;i++)b[i]=b[i]-a[i]*Rb;
}


这篇关于求解矩阵的最简行矩阵的C++程序代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/725739

相关文章

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快