经典数据结构之二维矩阵的基本运算

数组的数组即是矩阵,这篇文章就是很好的例子。往往我们会抱怨c++ std里面没有现成的矩阵运算库,其实,矩阵运算十分容易构造,不论是二维数组,还是经过打包的数组,甚至是vector等容易,都可以很轻易地做出扩展,满足我们复杂的要求。


具体代码如下所述:

.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






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值