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拿第一段,矩陣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++实现矩阵乘法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy找到矩阵中不同元素的种类_基于
- 下一篇: python能做高频交易吗_python