24,855
社区成员
发帖
与我相关
我的任务
分享
#ifndef _MATRIX_H //避免多次编译
#define _MATRIX_H
#include "stdafx.h"
#include <valarray> //模板类valarray的标准头文件
#include "comm.h" //公共头文件
#include <math.h> //数学头文件
template <class _Ty>
class matrix //矩阵类matrix
{
typedef matrix<_Ty> _Myt;
private:
std::valarray<_Ty> m_Datas; //定义一维数组对象m_Datas
size_t m_stRow; //矩阵行数变量
size_t m_stCol; //矩阵列数变量
public:
typedef _Ty value_type;
//构造函数一(参数1, 2分别为矩阵的行与列数)
/******
矩阵类matrix的构造函数一
构造函数中出现的m_Datas为valarray类的对象,申请stRow * stCol个单元,
单元内没赋值。对数组对象m_Datas使用了valarray类的构造函数:
explicit valarray(size_t n)
对私有变量m_stRow和m_stCol分别赋初值stRow, stCol。
******/
matrix(size_t stRow, size_t stCol)
: m_Datas(stRow * stCol),
m_stRow(stRow), m_stCol(stCol)
{
m_Datas.resize(GetRowNum() * GetColNum(), _Ty(0));
/*
构造函数中出现的m_Datas为valarray类的对象,若在函数体内调用的
resize(size_t n, const T& c = T())函数有两个参数(参阅valarray中的
定义),第一个参数申请有矩阵行*列那么多元素个数的存储空间,第二个
参数对这些申请的空间赋予具有模式T的初值0。如果不调用该函数,则缺省
情况下m_Datas长度为0;另外,调用该函数但不使用第二个参数,则不会对
m_Datas的任何一个元素赋初值。
*/
}
//构造函数二(参数1为指向矩阵的指针,参数2, 3为矩阵行与列数)
/******
矩阵类matrix的构造函数二
对私有变量m_stRow和m_stCol分别赋初值stRow, stCol。
对数组对象m_Datas使用了valarray类的构造函数:
valarray(const _Ty *p, size_t n)
m_Datas初始化的第一参数为矩阵rhs指针,第二个参数为rhs的元素总个数,
即rhs行数*列数
******/
matrix(const _Ty* rhs, size_t stRow, size_t stCol)
: m_Datas(rhs, stRow * stCol),
m_stRow(stRow), m_stCol(stCol)
{
}
//构造函数三(拷贝构造函数,参数为对矩阵matrix的引用)
/******
矩阵类matrix的构造函数三
用引用矩阵rhs的数组对象m_Datas初始化matrix所定义对象的m_Datas,
用引用矩阵rhs的行数rhs.GetRowNum()和列数rhs.GetColNum()分别初始化私
有变量m_stRow和m_stCol
******/
matrix(const _Myt& rhs)
: m_Datas(rhs.m_Datas),
m_stRow(rhs.GetRowNum()), m_stCol(rhs.GetColNum())
{
}
size_t GetRowNum() const //返回矩阵行数的函数
{
return m_stRow;
}
size_t GetColNum() const //返回矩阵列数的函数
{
return m_stCol;
}
/*****
重载运算符(),获取二维矩阵某元素在一维数组m_Datas的位置
(matrix类定义的矩阵实际上已经被转化为一维数组m_Datas)
当数组元素(i, j)在运算符左边(被写)时,使用_Ty& operator ()
当数组元素(i, j)在运算符右边(被读)时,使用_Ty operator ()
*****/
_Ty& operator () (size_t stRow, size_t stCol)
{
Assert(stRow < GetRowNum()); //断定stRow不超实际矩阵行值
Assert(stCol < GetColNum()); //断定stCol不超实际矩阵列值
return m_Datas[stRow * GetColNum() + stCol];
}
/******
重载()运算符,返回二维矩阵中元素(stRow, stCol)在一维数组中的位置
stRow与stCol分别为矩阵某元素行与列的位置数
当矩阵元素在运算符右边(被读)时使用
******/
const _Ty operator () (size_t stRow, size_t stCol) const
{
Assert(stRow < GetRowNum()); //断定stRow不超实际矩阵行值
Assert(stCol < GetColNum()); //断定stCol不超实际矩阵列值
return m_Datas[stRow * GetColNum() + stCol];
}
我猜测应该是因为这个类里头有不少size_t类型的变量,而size_t在32位里是unsigned int,在64位里是unsigned long long,所以运行时间不相同