经典数据结构之二维矩阵的基本运算
2013-11-21 23:26
579 查看
数组的数组即是矩阵,这篇文章就是很好的例子。往往我们会抱怨c++ std里面没有现成的矩阵运算库,其实,矩阵运算十分容易构造,不论是二维数组,还是经过打包的数组,甚至是vector等容易,都可以很轻易地做出扩展,满足我们复杂的要求。
具体代码如下所述:
.h文件
具体代码如下所述:
.h文件
#ifndef CARRAY2D_HHH #define CARRAY2D_HHH #include <cassert> #include "Array1D.h" template<typename T> class CArray2D{ private: // members; int m_nRow, m_nCol; CArray1D<T>* m_pArray; public: // constructors; CArray2D(const int& row, const int& col); CArray2D(const CArray2D& array); ~CArray2D(); // methods; // row Size; int mRowSize() const; // col Size; int mColSize() const; // operator []; CArray1D<T>& operator[](int index) const; // operator +; CArray2D<T> operator+() const; CArray2D<T> operator+(const CArray2D<T>& array) const; // operator -; CArray2D<T> operator-() const; CArray2D<T> operator-(const CArray2D<T>& array) const; // operator *; CArray2D<T> operator*(const CArray2D<T>& array) const; // operator =; CArray2D<T>& operator=(const CArray2D<T>& array); // operator +=; CArray2D<T>& operator+=(const CArray2D<T>& array); // print; void print(std::ostream& out) const; }; template<typename T> CArray2D<T>::CArray2D(const int& row, const int& col): m_nRow(row), m_nCol(col){ assert((row > 0) && (col > 0)); m_pArray = new CArray1D<T>[row]; for(int i = 0; i < row; i ++) m_pArray[i].mResize(m_nCol); } template<typename T> CArray2D<T>::CArray2D(const CArray2D<T>& array): m_nRow(array.m_nRow), m_nCol(array.m_nCol){ m_pArray = new CArray1D<T>[m_nRow]; for(int i = 0; i < m_nRow; i ++){ m_pArray[i] = array[i]; } } template<typename T> CArray2D<T>::~CArray2D(){ delete [] m_pArray; } template<typename T> int CArray2D<T>::mColSize() const{ return m_nCol; } template<typename T> int CArray2D<T>::mRowSize() const{ return m_nRow; } template<typename T> CArray1D<T>& CArray2D<T>::operator[](int index) const{ assert(index >= 0) && index < m_nRow); return m_pArray[index]; } template<typename T> CArray2D<T>& CArray2D<T>::operator=(const CArray2D<T>& array){ if(&array != this){ delete [] m_pArray; m_pArray = new CArray1D<T>[m_nRow]; m_nRow = array.m_nRow; m_nCol = array.m_nCol; for(int i = 0; i < m_nRow; i ++){ m_pArray[i] = array[i]; } } return *this; } template<typename T> CArray2D<T> CArray2D<T>::operator+() const{ CArray2D<T> tmp(m_nRow, m_nCol); for(int i = 0; i < m_nRow; i ++) tmp.m_pArray[i] = (+m_pArray[i]); return tmp; } template<typename T> CArray2D<T> CArray2D<T>::operator+(const CArray2D<T>& array) const{ assert((m_nRow == array.m_nRow) && (m_nCol == array.m_nCol)); CArray2D<T> tmp(m_nRow, m_nCol); for(int i = 0; i < m_nRow; i ++) tmp.m_pArray[i] = this->m_pArray[i] + array.m_pArray[i]; return tmp; } template<typename T> CArray2D<T> CArray2D<T>::operator-() const{ CArray2D<T> tmp(m_nRow, m_nCol); for(int i = 0; i < m_nRow; i ++) tmp.m_pArray[i] = (-m_pArray[i]); return tmp; } template<typename T> CArray2D<T> CArray2D<T>::operator-(const CArray2D<T>& array) const{ assert((m_nRow == array.m_nRow) && (m_nCol == array.m_nCol)); CArray2D<T> tmp(m_nRow, m_nCol); for(int i = 0; i < m_nRow; i ++) tmp.m_pArray[i] = this->m_pArray[i] - array.m_pArray[i]; return tmp; } template<typename T> CArray2D<T> CArray2D<T>::operator*(const CArray2D<T>& array) const{ assert(array.m_nCol == m_nRow); CArray2D<T> tmp(m_nRow, array.m_nCol); for(int i = 0; i < m_nRow; i ++){ for(int j = 0; j < array.m_nCol; j ++){ tmp.m_pArray[i][j] = 0; for(int k = 0; k < m_nCol; k ++) tmp.m_pArray[i][j] += m_pArray[i][k] * array.m_pArray[k][j]; } } return tmp; } template<typename T> void CArray2D<T>::print(std::ostream& out) const{ for(int i = 0; i < m_nRow; i ++) m_pArray[i].print(out); } #endif
相关文章推荐
- 经典数据结构之矩阵的基本运算
- 经典数据结构之一维矩阵的基本操作
- 数据结构之矩阵的乘法运算
- 数据结构实践——顺序表的基本运算
- 【数据结构之链队列的基本运算】
- 数据结构之三元组顺序表实现稀疏矩阵运算(参考整理严蔚敏数据结构)
- 链表数据结构与基本运算
- 数据结构实验2(二叉链表实现二叉树的基本运算)
- java基础复习1--基本数据类型、运算符号、表达式语句与程序结构
- 数据结构——数组—稀疏矩阵及运算
- 数据结构与基本运算
- 数据结构-顺序存储-线性表-基本运算
- 数据结构之顺序表上的基本运算
- 数据结构--数组和广义表--以行逻辑链接的顺序表为存储结构的矩阵的基本运算(求矩阵乘积)
- R语言学习笔记(一)——数据结构与基本运算
- 数据结构之自建算法库——二叉树的链式存储及基本运算
- opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构
- 数据结构实践——对称矩阵的压缩存储及基本运算
- 【数据结构】单链表上的基本运算
- 数据结构——二维矩阵——数组实现(C++)