一:先看下面兩個矩陣相乘:
矩陣A和B都是兩行兩列,矩陣相乘時,A的行元素乘以B的列元素,然後相加。即
202+51=45作爲C11(矩陣C的第一行第一列)
201+54=40作爲C12(矩陣C的第一行第二列)
152+101=40作爲C21(矩陣C的第二行第一列)
151+104=55作爲C22(矩陣C的第二行第二列)
學過線性代數的,肯定非常熟悉!
二:例題
三:解題思路:
(1)使用a【8】【8】和b【8】【8】 兩個二維數組,接受用戶使用鍵盤輸入2個矩陣。二維數組c作爲結果矩陣。
(2)思路:通過分析矩陣相乘的規則。
宏觀上來看,每次就是操作二維數組a的每一行,二維數組b的每一列。所以首先就需要使用兩層嵌套for循環,外層遍歷範圍是a的行數,內層是b的列數。現在計算二維數組c架子已經搭起來了,剩下就是填充二維數組的值了。我們在使用一層for循環,即一共三層嵌套for循環,那麼第三層for循環的範圍是多少?就是公共的下標號(例:2 X 3,3 X 1 就是相同的3)。好了,之前的二層for循環可以搭配第三層的for循環開始幹活了,第一層搭配第三層能夠取二維數組a的每一行元素,第二層搭配第三層能夠取出二維數組b的每一列,進行相乘就行了。
我們可以編一個口訣幫助記憶(tip:用一些順口溜,圖解可以容易理解也方便記憶)
一層循環 到行號
二層循環 到列號
三層循環 相同號
行列元素相乘出結果
我是這樣編的,有文采好的朋友,歡迎留言
代碼:
#include <iostream>
#include <stdio.h>
#define Length 8
using namespace std;
int main() {
int m, n, p, q=0;
int a[Length][Length], b[Length][Length],c[Length][Length];
cout << "請輸入m*n的m和n的值" << endl;
cin >> m >> n;
cout << "請輸入m*n的具體元素" << endl;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++){
cin >> a[i][j];
}
}
cout << "請輸入p*q的具體元素" << endl;
cin >> p >> q;
cout << "請輸入p*q的具體元素" << endl;
for (int i = 0; i < p; i++) {
for (int j = 0; j < q; j++) {
cin >> b[i][j];
}
}
for (int i = 0; i < m; i++) {// 一層循環 第一個矩陣的行號
for (int j = 0; j < q; j++) {// 二層循環 第二個矩陣的列號
int sum = 0;
for (int ii = 0; ii < n; ii++){// 三層循環 兩個矩陣的共同號
sum+=a[i][ii] * b[ii][j];// 行列元素相乘出結果
}
c[i][j] =sum;
}
}
for (int i = 0; i < m; i++) {// 輸出
for (int j = 0; j < q; j++) {
cout << c[i][j]<<" ";
}
cout << endl;
}
return 0;
效果: