c++矩阵作为函数输入变量_C++实现矩阵乘法
最近學(xué)習(xí)C++,做了一個矩陣乘法的練習(xí)。先說一下功能,輸入兩個矩陣A,B,大小自己定,換行用;表示(matlab的習(xí)慣)。然后輸出A*B的矩陣。
1.思路
首先,由于輸入的矩陣維數(shù)是隨機的,因此,我們要設(shè)計程序,手動把行和列算出來,這樣方便后續(xù)乘法運算。并且把輸入的數(shù)字提取出來,放入一個float型數(shù)組中,這樣我們就完成了讀入工作,之后就是利用乘法公式進(jìn)行運算,并把結(jié)果放入一個二維數(shù)組中,最后把結(jié)果輸出來就行了。
2.數(shù)據(jù)讀入
這里是容易出現(xiàn)問題的地方,最初的想法是用cin.getline()把整個輸入都讀進(jìn)一個char型字符序列中,然后再用特定位置的數(shù)做乘法。后來發(fā)現(xiàn)有兩個問題,第一,數(shù)字讀入一個char字符序列中就變成了ASCII碼,這個還比較好解決,用每個位置的數(shù)減去‘ 0‘就行了。第二個問題是硬傷,就是把一個數(shù)字放到一個char型的序列中,他會把連在一起的數(shù)字給拆開,比如說我想輸入123,他不會把123放到一個格里,而是1放到一個格,2放入另一個格,3再放一個格。所以不能放到char[]中。于是想到把輸入放到float數(shù)組里, 但是這樣就有一個新問題,就是如何把符號摘出去。如果直接用cin,那么碰到符號它并不會跳過,而是也會錄入,這是不行的,但是對于這個問題,我們知道輸入的格式都是類似于:123,1,2;1,2,3這樣的,規(guī)律就是一個數(shù)字一個符號,我們可以用賦值的方式來跳過,和;的錄入。具體來說就是先用一個cin,把第一個數(shù)字錄入,然后用c=getchar()的方式來跳過逗號的錄入。然后再cin,再c=getchar,最終當(dāng)c=getchar()等于回車,也就是n時停止。由于c=getchar()是判斷條件,所以我們這個循環(huán)要從逗號開始,也就是先錄入一個數(shù)字,再進(jìn)行循環(huán)。
在錄入的過程中,我們就可以直接把行數(shù)和列數(shù)讀取出來:行數(shù)就是;(分號)的個數(shù)加一,列數(shù)就是總共的數(shù)字個數(shù)除以行數(shù)。
cout拿第一段,矩陣A的錄入來說,m是行數(shù),由于m作為;的計數(shù)器,因此行數(shù)要在分號個數(shù)的基礎(chǔ)上加一,即m++,而由于A[ ]這個數(shù)組是從A[0]開始的,因此A[i]表示有i+1個數(shù),所以i++。這樣就實現(xiàn)了矩陣A,B的錄入,雖然錄進(jìn)去的是一個一維的數(shù)組,但也不妨礙后續(xù)的矩陣乘法計算。
3.矩陣相乘
有了兩個數(shù)組,我們要做的就是把計算結(jié)果放入一個二維數(shù)組C[ ][ ]里。我們可以用兩層循環(huán)嵌套來實現(xiàn)每一個位置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列是一維數(shù)組A的第i*n+a個數(shù),即A[i*n+a-1],同理B的第a行第j+1列為B[(a-1)*p+j]。循環(huán)相乘再賦值就可以得到C的值。
3.輸出
利用兩層嵌套循環(huán)便可以把二維數(shù)組輸出:
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 的作用是當(dāng)輸出到每一行最后一個數(shù)的時候換行。
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; }這是運行結(jié)果:
版本二
這次考慮用類來實現(xiàn)矩陣乘法,想法就是定義一個類叫Matrix,這個類包含一個函數(shù)get_in,作用就是把你按格式輸入的矩陣存入一個一維數(shù)組M[100]里面,為了方便后續(xù)的計算,我們還要分別以下public參數(shù):m表示行數(shù),n表示列數(shù),k表示總共的數(shù)字個數(shù)。我們來看一下這個類。
int原理前面介紹過,總結(jié)來說就是一個小竅門:用c=getchar()來把中間用于分割的,和;拿掉,剩下的都存到一個一維數(shù)組M[100]中。這里的x作為一個矩陣的計數(shù)器。
接下來我們再定義一個函數(shù)mat_mul,作用就是把兩個函數(shù)進(jìn)行乘法運算,然后再輸出。所以很顯然的參數(shù)是兩個Matrix型的矩陣A和B,然后根據(jù)公式
來進(jìn)行編寫程序并把結(jié)果存入一個二維數(shù)組C[10][10]中,然后再把這個二維數(shù)組輸出。
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;}}}}定義完類和矩陣相乘函數(shù),就可以很容易寫出主函數(shù)了:
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;先用類里面的錄入函數(shù)把兩個矩陣錄入進(jìn)來,再檢測一下是否兩個矩陣可以進(jìn)行乘法運算,就是看一下第一個矩陣的列數(shù)是否等于第二個矩陣的行數(shù),沒什么問題就可以進(jìn)行相乘并輸出了。下面是運行結(jié)果:
附上完整代碼:
#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; }; //定義矩陣相乘函數(shù) 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; }最后再說一個容易忽視的點,就是不是全局的變量,類里面的,函數(shù)里面的,一定要初始化!一定要初始化!一定要初始化!
總結(jié)
以上是生活随笔為你收集整理的c++矩阵作为函数输入变量_C++实现矩阵乘法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy找到矩阵中不同元素的种类_基于
- 下一篇: python能做高频交易吗_python