C++实现矩阵乘法

时间:2019-02-16
本文章向大家介绍C++实现矩阵乘法,主要包括C++实现矩阵乘法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

最近学习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 << "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;

 

拿第一段,矩阵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;
}

这是运行结果: