之前我們已經用陣列的陣列方式寫了乙個二維陣列,並實現了其轉置,加法和乘法運算,現在我們將用行主描述方法重寫乙個矩陣及其運算。
template
class matrix
int rows() const
int columns() const
t& operator() (int i,int j)const;
matrix& operator=(const matrix&);
matrixoperator+() const;
matrixoperator+(const matrix&) const;
matrixoperator-() const;
matrixoperator-(const matrix&) const;
matrixoperator*(const matrix&)const;
matrix& operator+=(const t&);
private:
int therows,thecolumns;
t *element;
}
以上是類定義,下面是主要實現**
template
matrix::matrix(int therows,int thecolumns)
template
matrix::matrix(const matrix& m)
以上是建構函式和複製建構函式
template
matrix& matrix::operator=(const matrix& m)
return *this;
}
賦值過載符與複製建構函式類似,就是將同類複製給自己。將其他類賦值給自己需要建構函式支援。
template
t& matrix::operator()(int i,int j)const
獲取**有一點需要注意,那就是對矩陣而言資料是從1開始的,而不是從0
但是我們訪問的時候是從零開始的所以我們要在行列上減1.
template
matrixmatrix::operator+(const matrix& m)const
這個程式很簡單,我就是想強調一下,在進行任何操作之前,都要對資料
進行檢查,符合標準後在寫接下來的操作,比如這裡就要檢查資料的形狀
是否相同。
template
matrixmatrix::operator*(const matirx& m)const
w.element[cw++]=sum;
ct-=thecolumns-1;//上乙個迴圈執行完後ct變為thecolumns-1,這時將其歸零.
//之所以不直接等於0是考慮下次歸為第二行的0個元素。
cm=j;//從m的第j列開始乘。
}ct+=thecolumns;//變為第二行
cm=0;//m從第0列開始乘。
}return w;
}
這個**的思想和之前寫的乘法思想是一模一樣的,三層迴圈,難的地方在於對映公式的處理
比如,下一行的第乙個元素要在第一行第乙個元素的基礎上要加thecolumns等。
不過其實在我們重寫了()符號後,我們可以呼叫這個符號對元素進行訪問,那麼**就和
之前的陣列的陣列來描述二維陣列的矩陣乘法**差不多了。
下面介紹幾個特殊矩陣的實現
1,對角矩陣
template
class diagonalmatrix
t get(int,int)const;
void
set(int,int,const t&);
private:
int n;
t*element;
}template
diagonalmatrix::diagonalmatrix(int then)
template
t diagonalmatrix::get(int i,int j)const
template
void diagonalmatrix::set(int i,int j,const t& newvalue)
很簡單且節約記憶體,這就是為什麼對焦矩陣在很多軟體中都單獨定義的原因。
三對角矩陣
要理解三對角矩陣,最關鍵的是理解其索引的規律,低於對角矩陣,我們的規律是i=j,對於三對角矩陣,我們有如下的規律:
(1)主對角線——i=j;
(2) 主對角線之下的對角線(稱低對角線)——i=j+1;
(3) 主對角線之上的對角線(稱高對角線)——i=j-1;
這三條對角線上的元素總數為3*rows-2。可以用乙個容量為3*rows-2的一維陣列element來描述三對角矩陣,然後就是確定元素的排列方式了,有逐行對映,逐列對映和逐條對映,逐條對映就是先從低對角線開始儲存,然後對角戲,最後高對角線。這裡我們採用逐條對映。
下面只給出get方法,set方法類推:
template
t tridiagonalmatrix::get(int i,int j)const
}
上式中n代表矩陣的階數(注意對角矩陣和三對角矩陣是方陣)第一條即低對角線的個數為n-1,而矩陣是從第一行第一列開始的而不是0行0列,所以對於下對角線,其第乙個元素的索引為(2,1)即i從2開始,所以其對應的索引為i-2,中對角線第乙個元素索引為(1,1) i從1開始,而前面有n-1個低對角線元素,所以其索引為n-1+i-1=n+i-2,同理上對角線的索引為2*n+i-2.
三角矩陣
在乙個n行的下三角矩陣中,非0區域的第一行有1個元素,第二行有2個元素,……第n行有n各元素,上三角矩陣則正好與其相反。
這兩種三角矩陣都可以用乙個大小為n(n+1)/2的一維陣列來表示。
同樣,其排列順序也有行主和列主之分。這裡使用行主放大,且只給出set方法。
template
t lowertridiagonalmatrix::set(int i,int j,const t& newvalue)
對於索引為(i,j)的下三角型元素,其上面有(i-1)(i-1+1)/2個非零元素,第第i行的第j個元素的索引為就j-1 因為矩陣索引從1開始計算,而我們儲存時從0開始,所以加起來就是i*(i-1)/2+j-1。
4.乙個n*n對稱矩陣,可以視為下三角或上三角矩陣,用三角矩陣的表示方法,用乙個大小為n(n+1)/2的一維陣列來表示。未儲存的元素可以用儲存的元素來計算。
特殊矩陣 稀疏矩陣
對於乙個m n的矩陣,設s為矩陣的元素總個數s m n,設t為矩陣中非零元素的個數,滿足t 稀疏矩陣的零元素非常多,且分布無規律,所以稀疏矩陣的壓縮儲存方法為 只儲存矩陣中的非零元素,按照三元組的形式儲存。三元組由非零元素,該元素行下標和該元素列下標三個資料構成,放在乙個列數為3的陣列中。儲存結構又...
特殊矩陣之稀疏矩陣
特殊矩陣的第二種 稀疏矩陣 稀疏矩陣是指矩陣中有效元素遠遠小於無效值的個數,大概比例就是 有效值個數 無效值個數 0.05 所以,稀疏矩陣在儲存時只需要儲存有效元素的位置資訊以及值,對於無效值只需要用 invalid來記錄。include include include using namespac...
矩陣特殊轉換
習題描述 將乙個5 5的矩陣中最大的元素放在中心,四個角分別放四個最小的元素 順序從左到右,從上到下順序依次從小到大存放 寫乙個函式實現之。用main函式呼叫。例如原來矩陣 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 ...