[C++/PTA] 矩阵的乘法运算

news/2023/12/4 22:03:46

[C++/PTA] 矩阵的乘法运算

    • 题目要求
    • 解题思路
    • 代码
    • 总结

题目要求

线性代数中的矩阵可以表示为一个row*column的二维数组,当row和column均为1时,退化为一个数,当row为1时,为一个行向量,当column为1时,为一个列向量。
建立一个整数矩阵类matrix,其私有数据成员如下:

int row;
int column;
int **mat;

建立该整数矩阵类matrix构造函数;
建立一个 *(乘号)的运算符重载,以便于对两个输入矩阵进行乘法运算;
建立输出函数void display(),对整数矩阵按行进行列对齐输出,格式化输出语句如下:

cout<<setw(10)<<mat[i][j];
//需要#include <iomanip>

主函数里定义三个整数矩阵类对象m1、m2、m3.
###输入格式:
分别输入两个矩阵,分别为整数矩阵类对象m1和m2。
每个矩阵输入如下:
第一行两个整数 r c,分别给出矩阵的行数和列数
接下来输入r行,对应整数矩阵的每一行
每行输入c个整数,对应当前行的c个列元素
###输出格式:
整数矩阵按行进行列对齐(宽度为10)后输出
判断m1和m2是否可以执行矩阵相乘运算。
若可以,执行m3=m1*m2运算之后,调用display函数,对m3进行输出。
若不可以,输出"Invalid Matrix multiplication!"
提示:输入或输出的整数矩阵,保证满足row>=1和column>=1。

输入样例:

4  5
1 0 0 0 5
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
5  5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 8 9
5 6 7 8 9

输出样例:

    26        32        38        44        504         6         8        10        129        12        15        18        2116        20        24        32        36

解题思路

首先创建一个矩阵类 matrix,然后定义矩阵的行数 row、列数 column 和矩阵元素 mat,并在类中定义矩阵的构造函数、输入函数 get()、输出函数 display()、判断两个矩阵能否相乘的友元函数 judge() 和矩阵乘法运算符operator*()

  1. 定义矩阵类 matrix,其中包含矩阵的行数 row、列数 column 和元素 mat。矩阵的构造函数可以不用定义什么操作,因为默认初始化时行列数都为0,指向元素的指针也为空,不会影响后续使用。

  2. 在类中定义输入函数 get(),用于输入矩阵的行数、列数和元素,并将其存储到类的私有成员变量中。在函数内部可以使用二维数组动态分配内存,确保输入的数据能够正确存储。

  3. 在类中定义输出函数 display(),用于输出矩阵的元素。在输出时可以使用 setw() 控制输出宽度,使矩阵能够更加美观地显示出来。

  4. 在类外定义判断两个矩阵能否相乘的友元函数 judge(),用于判断两个矩阵是否符合矩阵乘法的条件。即第一个矩阵的列数必须等于第二个矩阵的行数才能相乘,否则无法进行矩阵乘法。
    注意,如果其中一个矩阵是 1×11×1 矩阵,那么它也可以和任何一个矩阵相乘。

  5. 在类外定义矩阵乘法运算符 operator*(),使用友元函数的形式重载运算符。在运算符内部,首先判断第一个矩阵是否是 1×11×1 矩阵,如果是,则直接针对第二个矩阵进行乘法操作;否则,根据矩阵乘法的定义循环遍历计算每个元素的值,并存储到一个新的矩阵中。

  6. 在主函数 main() 中,首先通过输入参数创建两个矩阵对象 m1 和 m2,然后调用 judge() 函数判断它们是否能够相乘。如果可以,则调用矩阵乘法运算符 operator*() 计算它们的乘积,并将结果保存到另一个矩阵对象 m3 中,最后使用 display() 函数输出 m3 的元素。

代码

#include<iostream>
#include<iomanip>
using namespace std;
class matrix{private:int row;     int column;int **mat;       public:matrix(int a=0,int b=0):row(a),column(b){};   void get(int ,int);     void display();        friend bool judge(const matrix &a,const matrix &b);   friend matrix operator*(const matrix &a,const matrix &b);  
};
void matrix::get(int a,int b){  int v,q;row=a;                column=b;mat=new int*[a];for(v=0;v<a;v++){       mat[v]=new int[b];}for(v=0;v<row;v++){for(q=0;q<column;q++){cin>>mat[v][q];}}
}
bool judge(const matrix &a,const matrix &b){if(a.column==b.row||a.column==1&&a.row==1){   return true;                              }else{                                     return false;}
}
void matrix::display(){int v,q;for(v=0;v<row;v++){for(q=0;q<column;q++){cout<<setw(10)<<mat[v][q];}cout<<endl;         }
}
matrix operator*(const matrix &a,const matrix &b){matrix c;int v=0,q=0,k=0,l=0,sum=0;if(a.column==1&&a.row==1){     c.row=b.row;c.column=b.column;c.mat=new int*[b.row];for(v=0;v<b.row;v++){c.mat[v]=new int[b.column];}for(v=0;v<b.row;v++){for(q=0;q<b.column;q++){    c.mat[v][q]=a.mat[0][0]*b.mat[v][q];}}}else{c.row=a.row;       c.column=b.column;c.mat=new int*[a.row];for(v=0;v<a.row;v++){c.mat[v]=new int[b.column];}for(v=0;v<a.row;v++){for(q=0;q<b.column;q++){   for(k=0;k<a.column;k++){sum+=a.mat[v][k]*b.mat[k][q]; }c.mat[v][q]=sum;sum=0;}}}return c;
}
int main(){         matrix m1,m2,m3;int a,b;cin>>a>>b;m1.get(a,b);cin>>a>>b;m2.get(a,b);if(judge(m1,m2)){m3=m1*m2;m3.display();}else{cout<<"Invalid Matrix multiplication!"<<endl;}return 0;
}

总结

该题考察矩阵乘法的基本概念,例如如何判断两个矩阵是否能够相乘如何实现矩阵乘法的核心计算操作等,读者可躬身实践。
我是秋说,我们下次见。


http://www.ppmy.cn/news/78534.html

相关文章

【Linux服务】web基础与HTTP协议

web基础与HTTP协议 一、域名概述1.1域名空间结构1.2域名注册 二、网页的概念三、HTML概述3.1HTML超文本标记语言 四、Web概述4.1Web1.0与Web2.04.2静态网页4.3动态网页 五、HTTP协议概述5.1HTTP协议版本5.2http请求方法5.3GET 和 POST 比较5.4HTTP状态码5.5HTTP请求流程 一、域…

c++代码手撕红黑树

企业里永远是技术驱动理论发展 比起理解红黑树的原理&#xff0c;更重要的是理解红黑树的应用场景&#xff0c;因为某些应用场景的需要&#xff0c;红黑树才会应运而生。 红黑树的特点&#xff1a; 插入&#xff0c;删除&#xff0c;查找都是O(logn)的复杂度。 红黑树的应用…

简单写写grep和egrep的区别

egrep 和 grep 的作用都是在文件中搜索匹配指定模式的文本&#xff0c;并将匹配的行输出到标准输出。它们的区别在于所支持的正则表达式语法不同。 grep 支持基本的正则表达式语法&#xff0c;包括&#xff1a; .&#xff1a;匹配任意一个字符&#xff1b;*&#xff1a;匹配前…

linux 部署Nginx

1&#xff0c;进入官网下载Nginx资源: 官网下载&#xff1a;http://nginx.org/en/download.html 2、下载 nginx-1.20.2 3、上传服务器 /opt目录 4、解压nginx-1.20.2.tar.gz 到当前目录 tar -zxvf nginx-1.20.2.tar.gz 5、配置基本信息&#xff0c;命令如下 #配置config…

Qt--事件过滤器

写在前面 Qt中的事件过滤器(Event Filter)是一种机制&#xff0c;用于拦截并处理特定类型的事件。但和Qt–事件分发器一文中提到的事件分发器有些区别。 事件过滤器的工作原理 这里同样使用一个简单的示例图帮助理解&#xff1a; 这里假设有一个Widget父窗口&#xff0c;该…

R语言实践——rWCVP:世界维管植物名录的R包

rWCVP&#xff1a;世界维管植物名录的R包 介绍1. 参照github安装与简单例子1.1 安装rWCVP1.2 安装rWCVPdata1.3 github的例子 2. rWCVP原始文献阅读2.1 前言&#xff08;背景&#xff09;2.2 功能概要2.2.1 名称匹配&#xff08;wcvp_match_names(), wcvp_match_exact(), wcvp …

FreeRTOS-任务通知详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转FreeRTOS &#x1f4ac;保持…

CMOS图像传感器——TDI CIS(2)

在之前的文章 CMOS图像传感器——TDI CIS_tdi相机的工作原理_沧海一升的博客-CSDN博客时间延迟积分(Time-Delay Integration, TDI)技术是一种特殊的成像模式https://blog.csdn.net/qq_21842097/article/details/119873386 对CMOS TDI图像传感器做了基本介绍,这里我们…

Linux安装Docker(这应该是你看过的最简洁的安装教程)

Docker是一种开源的容器化平台&#xff0c;可以将应用程序及其依赖项打包成一个可移植的容器&#xff0c;以便在不同的环境中运行。Docker的核心是Docker引擎&#xff0c;它可以自动化应用程序的部署、扩展和管理&#xff0c;同时还提供了一个开放的API&#xff0c;可以与其他工…

【如何开始学习Python编程?】

入门Python Python是一种高级编程语言&#xff0c;它被广泛应用于数据分析、人工智能、Web开发等领域。而作为新手&#xff0c;该如何入门Python呢&#xff1f; 学习方法 学习Python最好的方法就是动手编写代码&#xff0c;不必担心你没有任何编程经验&#xff0c;因为Pytho…

7.性能测试

目录 一、常见的性能问题 二、为啥要进行性能测试&#xff1f; 三、确定性能测试的需求&#xff08;性能指标&#xff0c;量化&#xff09; 1.关键性能指标分析 2.关键业务的分析 四、不同维度衡量系统的性能 1.研发人员 2.系统运维人员 3.用户 4.性能测试人员 五、性…

js刷题巩固之路

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以…

Hive动态分区和分桶使用场景和使用方法

1.分区 按照数据表的某列或某些列分为多个分区&#xff0c;分区从形式上可以理解为文件夹&#xff0c;比如我们要收集某个大型 网站的日志数据&#xff0c;一个网站每天的日志数据存在同一张表上&#xff0c;由于每天会生成大量的日志&#xff0c;导致数据表 的内容巨大&#x…

背景的样式

CSS中的background属性用于设置元素的背景样式&#xff0c;包括背景颜色、背景图片、背景大小、背景定位等。 背景颜色 (background-color): 用于设置元素的背景颜色。 语法&#xff1a; background-color: <color>; 示例&#xff1a; background-color: red; 背景图片 …

Java如何远程调试线上项目

远程调试java项目 [Remote Debug JVM] 一、前提二、配置IntelliJ IDEA2.1、打开 IntelliJ IDEA 并打开您的 Java 项目2.2、单击 "Run" 菜单&#xff0c;然后选择 "Edit Configurations..."2.3、在 "Run/Debug Configurations" 对话框中&#xff…

Electron 如何创建模态窗口?

目录 前言一、模态窗口1.Web页面模态框2.Electron中的模态窗口3.区分父子窗口与模态窗口 二、实际案例使用总结 前言 模态框是一种常用的交互元素&#xff0c;无论是在 Web 网站、桌面应用还是移动 APP 中&#xff0c;都有其应用场景。模态框指的是一种弹出窗口&#xff0c;它…

财务共享真的有价值吗?

国资委《关于中央企业加快建设世界一流财务管理体系的指导意见》在“完善智能前瞻的财务数智体系”中提出&#xff1a;“积极探索依托财务共享实现财务数字化转型的有效路径&#xff0c;推进共享模式、流程和技术创新&#xff0c;从核算共享向多领域共享 延伸&#xff0c;从账务…

「实在RPA·财务数字员工」加速财务数字化全方位升级!

一、财务数字化转型的重要性: 在全球数字经济浪潮下&#xff0c;数字化转型已成为各行各业关注和发展的重点。财务数字化是企业数字化转型的重中之重&#xff0c;只有紧跟时代步伐&#xff0c;牢牢抓住大数据给自身发展带来的机遇&#xff0c;提高企业核心竞争力&#xff0c;抢…

【lager】日志系统1:允许多个日志源向多个最终用户进行日志记录 windows cmake构建

【xerces】xerces-c-3.2.4 版本的cmake windows vs2022 构建 lager Light-weight Accumulator Gathering Efficiently in Real-time lagerLAGER(实时高效收集的轻量级累加器)是一个可靠的日志系统,旨在允许多个日志源向多个最终用户进行日志记录。该设计文档概述了整个系统的…

【小沐学Python】Python实现Web图表功能(ECharts.js,Flask)

&#x1f388;&#x1f388;&#x1f388;Python实现Web图表功能系列&#xff1a;&#x1f388;&#x1f388;&#x1f388;1&#x1f388;【Web开发】Python实现Web图表功能&#xff08;D-Tale入门&#xff09;&#x1f388;2&#x1f388;【Web开发】Python实现Web图表功能&a…
最新文章