想起編寫這個程式是複習線代備考的時候看到了乙個這樣的問題:
同濟線性代數(第五版)p30
例 2 四個城市的單向航線如圖所示
1,從 i 市到 j 市有1條單向航線
aij =
0,從 i 市到 j 市沒有單向航線
則上圖可用乙個矩陣表示:
a=(aij)= 0 1 1 1
1 0 0 0
0 1 0 0
1 0 1 0
對於a^2=aa=(bij),則bij為從 i 市經一次中轉到 j 市的單向航線條數。
第一次體會到矩陣這一抽象集合的實際運用!於是就想實現一下矩陣的乘法,運用了c++的類模板,因為矩陣裡的元素不一定是int型的嗎(順便用一下c++,之前都是寫c**,根本就不用c++的類),還
模擬了矩陣的乘法的定義,最終得以實現
#include
#include
#include
#define max 100
using namespace std;
template
class yunsuan
void get_value();
void array_mul();
void show_result();
private:
int n1,n2,n3,n4;
numtype a[max][max],b[max][max],c[max][max];
};template
void yunsuan::get_value()
template
void yunsuan::array_mul()
(1).對於
template
每次域外定義函式都要添上,不然就是語法錯誤。
(2).對於
#define max 100
不能定太大了,之前是定1000的,結果程式一執行就崩,這和是否是全域性開陣列有關,有大小限制,全域性大許多。(具體大多少,記不太清楚了,這是在協會聽學長說的)
(3).對於核心**:
template
void yunsuan::array_mul()
{for(int i=0; i
是個三重迴圈,迴圈應該是程式設計中最常用的了,迴圈對應的有規律的重複操作也正是我們利用計算機提公升效率的關鍵,我們要做的就是找到規律,然後是**的實現,最後的有規律的大量的重複計算就讓計算機來做了,所以程式設計的兩大難點之一是找規律(演算法方面),另一難點就是用**實現規律
(有時要運用資料結構的知識,或者在考慮演算法時就把資料結構考慮進來了)。這裡的規律就是從c[i][k]=a[i][j]*b[j][k];
我用了乙個實際例子來找規律(這是找規律普遍試用的方法,即舉個例子)
對於乙個3x3和乙個3x2的矩陣
a11*b11+a12*b21+a13*b31=c11
a11*b12+a12*b22+a13*b32=c12
多加觀察可以看出,c的行下標一直與a行下標的相同;
c的列下標一直和b的列下標相同;
b的行下標和a的列下標相同。
本來有6個下標變數,有這3個相同之後就是6-3=3個變數了。
找到規律之後就是**的實現了,
首先是第一重迴圈:
for(int i=0;i
這是先定行
之後是for(int k=0;k
這是每行下對應算出每個c矩陣的元素
for(int j=0;j
這是算每個c矩陣的元素時a每行元素與b每列元素相乘求和
(1)和(2)交換位置沒有關係。
矩陣乘法(2) 模板
輸入兩個矩陣,分別是m s,s n大小。輸出兩個矩陣相乘的結果。input 第一行,空格隔開的三個正整數m,s,n 均不超過200 接下來m行,每行s個空格隔開的整數,表示矩陣a i,j 接下來s行,每行n個空格隔開的整數,表示矩陣b i,j output m行,每行n個空格隔開的整數,輸出相乘後的...
矩陣乘法 C
using system using system.collections.generic using system.text namespace exe03 static void main string args int martixb new int int martixc new int m...
C 矩陣乘法
用慣了數學庫,有的時候有些基本的運算,像矩陣求逆,轉置矩陣什麼的,寫起來突然感覺有些生疏了,這裡算是對一些基本線性代數的複習。用c寫矩陣乘法 注意點 1 二維陣列與二級指標的區別 2 矩陣乘法的要點,新的結果矩陣的第i行第j列是矩陣a的第i行與矩陣b的第j列的乘積,這一點不熟悉,寫程式就會有點吃力 ...