最近學習c++,做了乙個矩陣乘法的練習。先說一下功能,輸入兩個矩陣a,b,大小自己定,換行用;表示(matlab的習慣)。然後輸出a*b的矩陣。
首先,由於輸入的矩陣維數是隨機的,因此,我們要設計程式,手動把行和列算出來,這樣方便後續乘法運算。並且把輸入的數字提取出來,放入乙個float型陣列中,這樣我們就完成了讀入工作,之後就是利用乘法公式進行運算,並把結果放入乙個二維陣列中,最後把結果輸出來就行了。
這裡是容易出現問題的地方,最初的想法是用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的錄入,雖然錄進去的是乙個一維的陣列,但也不妨礙後續的矩陣乘法計算。
有了兩個陣列,我們要做的就是把計算結果放入乙個二維陣列c[ ][ ]裡。我們可以用兩層迴圈巢狀來實現每乙個位置c[i][j]的賦值,對於每乙個c[i][j],我們有計算公式:
也就是c[i][j]等於a的第i行乘b的第j列。於是我們有如下**:
for (i = 0; i < m; i++)
} }
這裡解釋一下,這裡的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的值。
利用兩層巢狀迴圈便可以把二維陣列輸出:
for (u = 0; u < m; u++)
else
} }
這裡的if else 的作用是當輸出到每一行最後乙個數的時候換行。
把上述三個部分綜合一下,有如下**:
#includeusing 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()
m++;
i++;
n = i/ m;
cout << "please enter matrixb:"<> b[j];
while ((c = getchar()) != 'n')
k++;
j++;
p = j / k;
if (n != k)
for (i = 0; i < m; i++)
} }cout << "a*b=" 這是執行結果:
這次考慮用類來實現矩陣乘法,想法就是定義乙個類叫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) ;
int i=0, j=0, a=0;
for (i = 0; i < a.m; i++)
} }cout << "a*b=" << endl;
int u, v;
for (u = 0; u < a.m; u++)
else
} }}
定義完類和矩陣相乘函式,就可以很容易寫出主函式了:
int main()
mat_mul(a, b);
system("pause");
return 0;
先用類裡面的錄入函式把兩個矩陣錄入進來,再檢測一下是否兩個矩陣可以進行乘法運算,就是看一下第乙個矩陣的列數是否等於第二個矩陣的行數,沒什麼問題就可以進行相乘並輸出了。下面是執行結果:
附上完整**:
#includeusing namespace std;
int x = 0;
//定義矩陣類
class matrix ;
void matrix::get_in()
m++;
k++;
n = k / m;
};//定義矩陣相乘函式
void mat_mul(matrix a, matrix b) ;
int i=0, j=0, a=0;
for (i = 0; i < a.m; i++)
} }cout << "a*b=" << endl;
int u, v;
for (u = 0; u < a.m; u++)
else
} }}int main()
mat_mul(a, b);
system("pause");
return 0;
}
最後再說乙個容易忽視的點,就是不是全域性的變數,類裡面的,函式裡面的,一定要初始化!一定要初始化!一定要初始化! c 矩陣作為函式輸入變數 多變數回歸以及技巧
其中x0我們預設為1,所以其實就是乙個一元一次函式。這裡面的x1代表了我們的輸入,比如房價 中的房屋尺寸,h x 其實就是給出一種 但是我們知道,房價,房屋的尺寸一定不是影響房屋 的唯一變數,還有可能是地理位置,周邊建築,房屋年齡等等,所以就涉及到了我們今天要討論的問題,多變數回歸。首先呢,我們先給...
c 矩陣作為函式輸入變數 傳遞函式的表徵與描述
概述傳遞函式在以輸入 輸出為主的經典理論中有著不可替代的作用,同時在時域上,和以狀態空間為主的現代控制理論又有著許多交集。只有能夠自如地解釋相互間的聯絡,才算得上對理論的成功把握。傳遞函式的特殊情況是發生零極點對消的現象,而在資料 1 上稱發生零極點對消,意味著系統不能完全由輸入輸出模型,即不能由傳...
C語言指標變數作為函式引數
有讀者反饋,不理解字元陣列和普通陣列的區別,下面筆者作一下解答。實際上,字元陣列和普通陣列一樣,沒有本質區別。請大家注意陣列型別的含義 資料型別指的是陣列所包含的元素的型別,而不是陣列名的型別,陣列名永遠是乙個指標,指向第乙個元素的位址,即陣列首位址。字元陣列的每個元素都是char型別,整型陣列的每...