最近学习C++,做了一个矩阵乘法的练习。先说一下功能,输入两个矩阵A,B,大小自己定,换行用;表示(matlab的习惯)。然后输出A*B的矩阵。

1.思路

首先,由于输入的矩阵维数是随机的,因此,我们要设计程序,手动把行和列算出来,这样方便后续乘法运算。并且把输入的数字提取出来,放入一个float型数组中,这样我们就完成了读入工作,之后就是利用乘法公式进行运算,并把结果放入一个二维数组中,最后把结果输出来就行了。

2.数据读入

这里是容易出现问题的地方,最初的想法是用cin.getline()把整个输入都读进一个char型字符序列中,然后再用特定位置的数做乘法。后来发现有两个问题,第一,数字读入一个char字符序列中就变成了ASCII码,这个还比较好解决,用每个位置的数减去‘ 0‘就行了。第二个问题是硬伤,就是把一个数字放到一个char型的序列中,他会把连在一起的数字给拆开,比如说我想输入123,他不会把123放到一个格里,而是1放到一个格,2放入另一个格,3再放一个格。所以不能放到char[]中。于是想到把输入放到float数组里, 但是这样就有一个新问题,就是如何把符号摘出去。如果直接用cin,那么碰到符号它并不会跳过,而是也会录入,这是不行的,但是对于这个问题,我们知道输入的格式都是类似于:123,1,2;1,2,3这样的,规律就是一个数字一个符号,我们可以用赋值的方式来跳过,和;的录入。具体来说就是先用一个cin,把第一个数字录入,然后用c=getchar()的方式来跳过逗号的录入。然后再cin,再c=getchar,最终当c=getchar()等于回车,也就是n时停止。由于c=getchar()是判断条件,所以我们这个循环要从逗号开始,也就是先录入一个数字,再进行循环。

在录入的过程中,我们就可以直接把行数和列数读取出来:行数就是;(分号)的个数加一,列数就是总共的数字个数除以行数。

cout 

拿第一段,矩阵A的录入来说,m是行数,由于m作为;的计数器,因此行数要在分号个数的基础上加一,即m++,而由于A[ ]这个数组是从A[0]开始的,因此A[i]表示有i+1个数,所以i++。这样就实现了矩阵A,B的录入,虽然录进去的是一个一维的数组,但也不妨碍后续的矩阵乘法计算。

3.矩阵相乘

有了两个数组,我们要做的就是把计算结果放入一个二维数组C[ ][ ]里。我们可以用两层循环嵌套来实现每一个位置C[i][j]的赋值,对于每一个C[i][j],我们有计算公式:

也就是C[i][j]等于A的第i行乘B的第j列。于是我们有如下代码:

for (i = 0; i < m; i++) {for (j = 0; j < p; j++) {for (a = 1; a <= n; a++) {C[i][j] +=  A[i*n +a - 1] * B[(a - 1)*p  + j ];}}}

这里解释一下,这里的C[i][j]其实是第i+1行第j+1列,所以套用公式就是

而A的第i+1行第a列是一维数组A的第i*n+a个数,即A[i*n+a-1],同理B的第a行第j+1列为B[(a-1)*p+j]。循环相乘再赋值就可以得到C的值。

3.输出

利用两层嵌套循环便可以把二维数组输出:

for (u = 0; u < m; u++) {for (v = 0; v < p; v++) {if (v != p - 1) {cout << C[u][v]<<",";}else {cout << C[u][v] << endl;}}}

这里的if else 的作用是当输出到每一行最后一个数的时候换行。

4.整体代码

把上述三个部分综合一下,有如下代码:

#include<iostream>using namespace std;float A[100], B[100];
char c;
int m=0,n=0,k=0,p=0,i=0,j,a,u,v;
float C[10][10];int main() {cout << "please enter matrixA:"<<endl;cin >> A[i];while ((c=getchar()) != 'n') {cin >> A[++i];if (c == ';')m++;}m++;i++;n = i/ m;cout << "please enter matrixB:"<<endl;cin >> B[j];while ((c = getchar()) != 'n') {cin >> B[++j];if (c == ';')k++;}k++;j++;p = j / k;if (n != k) {cout << "error";return 0;}for (i = 0; i < m; i++) {for (j = 0; j < p; j++) {for (a = 1; a <= n; a++) {C[i][j] +=  A[i*n +a - 1] * B[(a - 1)*p  + j ];}}}cout << "A*B=" <<endl;for (u = 0; u < m; u++) {for (v = 0; v < p; v++) {if (v != p - 1) {cout << C[u][v]<<",";}else {cout << C[u][v] << endl;}}}system("pause");return 0;
}

这是运行结果:


版本二

这次考虑用类来实现矩阵乘法,想法就是定义一个类叫Matrix,这个类包含一个函数get_in,作用就是把你按格式输入的矩阵存入一个一维数组M[100]里面,为了方便后续的计算,我们还要分别以下public参数:m表示行数,n表示列数,k表示总共的数字个数。我们来看一下这个类。

int 

原理前面介绍过,总结来说就是一个小窍门:用c=getchar()来把中间用于分割的,和;拿掉,剩下的都存到一个一维数组M[100]中。这里的x作为一个矩阵的计数器。

接下来我们再定义一个函数mat_mul,作用就是把两个函数进行乘法运算,然后再输出。所以很显然的参数是两个Matrix型的矩阵A和B,然后根据公式

来进行编写程序并把结果存入一个二维数组C[10][10]中,然后再把这个二维数组输出。

void mat_mul(Matrix A, Matrix B) {float C[10][10] = {0};int i=0, j=0, a=0;for (i = 0; i < A.m; i++) {for (j = 0; j < B.n; j++) {for (a = 1; a <= A.n; a++) {C[i][j] += A.M[i*A.n + a - 1] *B.M[(a - 1)*B.n + j];}}}cout << "A*B=" << endl;int u, v;for (u = 0; u < A.m; u++) {for (v = 0; v < B.n; v++) {if (v != B.n - 1) {cout << C[u][v] << ",";}else {cout << C[u][v] << endl;}}}}

定义完类和矩阵相乘函数,就可以很容易写出主函数了:

int main() {Matrix A, B;A.get_in();B.get_in();if (A.n != B.m) {cout << "error";return 0;}mat_mul(A, B);system("pause");return 0;

先用类里面的录入函数把两个矩阵录入进来,再检测一下是否两个矩阵可以进行乘法运算,就是看一下第一个矩阵的列数是否等于第二个矩阵的行数,没什么问题就可以进行相乘并输出了。下面是运行结果:

附上完整代码:

#include<iostream>using namespace std;
int x = 0;
//定义矩阵类
class Matrix {public:float M[100];void get_in();int  m = 0, n = 0, k = 0;
};
void Matrix::get_in() {x++;cout << "please enter the " << x << "st matrix:";char c;cin >> M[k];while ((c = getchar()) != 'n') {cin >> M[++k];if (c == ';')m++;}m++;k++;n = k / m;
};
//定义矩阵相乘函数
void mat_mul(Matrix A, Matrix B) {float C[10][10] = {0};int i=0, j=0, a=0;for (i = 0; i < A.m; i++) {for (j = 0; j < B.n; j++) {for (a = 1; a <= A.n; a++) {C[i][j] += A.M[i*A.n + a - 1] *B.M[(a - 1)*B.n + j];}}}cout << "A*B=" << endl;int u, v;for (u = 0; u < A.m; u++) {for (v = 0; v < B.n; v++) {if (v != B.n - 1) {cout << C[u][v] << ",";}else {cout << C[u][v] << endl;}}}}int main() {Matrix A, B;A.get_in();B.get_in();if (A.n != B.m) {cout << "error";return 0;}mat_mul(A, B);system("pause");return 0;
}

最后再说一个容易忽视的点,就是不是全局的变量,类里面的,函数里面的,一定要初始化!一定要初始化!一定要初始化!

c++矩阵作为函数输入变量_C++实现矩阵乘法相关推荐

  1. c++矩阵作为函数输入变量_现代控制理论线性系统入门(七)输入输出解耦的控制器设计...

    上一章传送门: 善道:线性系统控制入门(六)用能控标准型设计控制器​zhuanlan.zhihu.com 在利用状态方程设计MIMO的能控标准型时,闭环系统的动态是完全不考虑输出变量 而直接预给的,M ...

  2. matlab怎么产生帕斯卡矩阵,MATLAB(一):矩阵基本操作

    MATLAB面向矩阵! MATLAB面向矩阵! MATLAB面向矩阵! 一些特殊矩阵 通用性特殊矩阵   如零矩阵,幺矩阵,单位矩阵等 用于专门学科的特殊矩阵   如魔方矩阵,范德蒙矩阵,希尔伯特矩阵 ...

  3. R语言自定义多分类混淆矩阵可视化函数(mutlti class confusion matrix)、R语言多分类混淆矩阵可视化

    R语言自定义多分类混淆矩阵可视化函数(mutlti class confusion matrix).R语言多分类混淆矩阵可视化 目录

  4. Python使用pandas的crosstab函数计算混淆矩阵并使用Seaborn可视化混淆矩阵实战

    Python使用pandas的crosstab函数计算混淆矩阵并使用Seaborn可视化混淆矩阵实战 目录 Python使用pandas的crosstab函数计算混淆矩阵并使用Seaborn可视化混淆 ...

  5. 【MATLAB】数据类型 ( 矩阵 | 随机数函数 | 生成矩阵 )

    文章目录 一.矩阵 1.定义矩阵 2.转置矩阵 3.矩阵放到一列 4.逆矩阵 二.随机数函数 1.rand 随机数函数 2.randn 随机数函数 3.randi 随机数函数 三.生成矩阵 1.生成 ...

  6. 推导LookAt函数定义的视图矩阵

    在OpenGL中需要定义一个视图(view)矩阵,很多库都提供一个叫LookAt的函数,可以定义该视图矩阵. 该函数的原型是 Mat4x4 LookAt(pos: vector3D, target: ...

  7. Matlab内置的矩阵反转函数

    发现了两个Matlab内置的矩阵翻转函数: flipud 上下反转 up - down fliplr 左右反转 left - right 来张图像试一下: girl = imread('girl-bo ...

  8. np.dot()函数用法(亲测矩阵算法)

    Numpy中dot()函数主要功能有两个:向量点积和矩阵乘法. 格式:x.dot(y) 等价于 np.dot(x,y) ---x是m*n 矩阵 ,y是n*m矩阵,则x.dot(y) 得到m*m矩阵. ...

  9. java 伴随矩阵_C#计算矩阵的逆矩阵方法实例分析

    本文实例讲述了C#计算矩阵的逆矩阵方法.分享给大家供大家参考.具体如下: 1.代码思路 1)对矩阵进行合法性检查:矩阵必须为方阵 2)计算矩阵行列式的值(Determinant函数) 3)只有满秩矩阵 ...

最新文章

  1. opencv_python使用cv2.imread()读取中文路径,cv2.imwrite()把图片写入中文路径。
  2. QML基础类型之int
  3. django ORM 操作
  4. 可耗竭且不可回收的资源
  5. PWN-PRACTICE-BUUCTF-13
  6. 计算机专业最新研究领,「金仕教育」打码秃头?CS计算机专业研究方向与研究领域介绍...
  7. 【原创】浅析密码学在互联网支付中的应用|RSA,Hash,AES,DES,3DES,SHA1,SHA256,MD5,SSL,Private Key,Public Key...
  8. php获取图片所有颜色代码,php 获取一张图片所有点的颜色值
  9. MySQL命令窗口下中文显示乱码的解决过程
  10. 用php求常见图形的面积,小学常见图形面积公式:菱形公式
  11. Lighting build failed. Swarm failed to kick off UE4光照构建失败
  12. redis 结合 spring
  13. 保姆级 nas 服务器搭建手册
  14. 小程序源码:喝酒娱乐小游戏助力神器-多玩法安装简单
  15. 2.郝斌C语言课程大纲
  16. 游戏合作伙伴专题:BreederDAO 与 Mech 一起加入战斗
  17. 8255A的工作方式
  18. 【MATLAB统计分析与应用100例】案例011:matlab读取Excel数据,调用regress函数作一元线性回归分析
  19. 四川大学计算机专业调剂,2019年四川大学计算机学院(软件学院)考研调剂信息
  20. java字符串进行中文、特殊字符编码

热门文章

  1. Vijos 1197 - 费解的开关
  2. 约瑟夫问题pascal程序
  3. AtCoder AGC004E Salvage Robots (DP)
  4. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】
  5. php tsrmg,php garbage collect
  6. 如何用python绘图、柱形图、线形图等_python使用Plotly绘图工具绘制散点图、线形图...
  7. pandas pivot 计算占比_数据分析Pandas 基础(二)
  8. 中间件方法必须返回Response对象实例(tp5.1+小程序结合时候出的问题)
  9. spring data jpa 官方文档
  10. C++子类父类构造函数的关系