|
|
发表于 2006-7-6 01:01:38
|
显示全部楼层
[求助]C++数组问题
对于数值计算中的应用,最好用的应该是valarray类,它是专门用于数值的一个类,而且内置了一些函数,十分便于应用。不过,要想用二维的最好自己做个封装。[br][br][以下内容由 sonix 在 2006年07月06日 01:26am 时添加] [br]
#pragma once
#include <valarray>
using namespace std;
//二维数组类,用vararray封装完成
//动作类似变量
class matrix
{
//代理类,完成取行、取列操作,并辅助完成[][]
//动作类似指针
private:
class _proxy{
private:
double*_Myptr;
size_t_MySize;
size_t_MyInc;
public:
_proxy(size_t size=0, size_t inc=0, double* ptr=NULL){_MySize = size;_MyInc = inc;_Myptr = ptr;}
~_proxy(){_MySize = 0;_MyInc = 0;_Myptr = NULL;}
const double& operator[](size_t _Off) const{return *(_Myptr+_Off*_MyInc);}//未判断是否越界
double& operator[](size_t _Off){return *(_Myptr+_Off*_MyInc);}//未判断是否越界
double operator*(const _proxy _Right){
double _rst=0.0;
if( _MySize == _Right._MySize )
for( size_t i=0; i<_MySize; i++)
_rst += (*this)*_Right;
return _rst;
}
private:
//不允许对代理类赋值
void operator=(double _Val){};
};
//私有变量
private:
size_t _MyRow;
size_t _MyCol;
valarray<double> _MyData;
//接口函数
public:
//默认构造函数
matrix(size_t row=0, size_t col=0, double data = 0):_MyRow(row), _MyCol(col), _MyData(data, row*col){}
//拷贝构造函数
//matrix(const matrix<_Ty>& _Right):_MyRow(_Rigth.row()), _MyCol(_Right.col()), _MyData(_Right.data()){}
//析构函数
~matrix(){}
//=================================================================================================
const size_t row(void) const {return _MyRow;}
const size_t col(void) const {return _MyCol;}
const valarray<double>& data(void) const {return _MyData;}
_proxy getRow(size_t rowN) {return _proxy( col(), 1, &_MyData[col()*rowN] );}
_proxy getCol(size_t colN) {return _proxy( row(), col(), &_MyData[colN] );}
//=================================================================================================
//赋值运算符
matrix& operator=(const matrix& _Right)
{
if(&_Right != NULL){
_MyRow = _Right.row();_MyCol = _Right.col();
_MyData = _Right.data();
}
return *this;
}
matrix& operator=( const double& _Val){_MyData = _Val;return *this;}
//[],配合_proxy类完成[][]
_proxy operator[](size_t rowN) {return getRow(rowN);}
//加法
matrix operator+(matrix& _Right)
{
if( row()==_Right.row() && col()==_Right.col() )
{
matrix _rst(*this);
_rst._MyData += _Right.data();
return _rst;
}
return matrix();
}
matrix& operator+(double _Right)
{
this->_MyData += _Right;
return *this;
}
//减法
matrix operator-(matrix& _Right)
{
if( row()==_Right.row() && col()==_Right.col() )
{
matrix _rst(*this);
_rst._MyData -= _Right.data();
return _rst;
}
return matrix();
}
matrix operator-(double _Right)
{
this->_MyData -= _Right;
return *this;
}
//乘法运算符
matrix operator*(matrix& _Right)
{
if( col() == _Right.row() )
{
matrix _rst( row(), _Right.col() );
for( size_t i=0; i<_rst.row(); i++ )
for( size_t j=0; j<_rst.col(); j++ )
_rst[j] = getRow(i)*_Right.getCol(j);
return _rst;
}
return matrix();
}
matrix operator*(double _Right)
{
matrix _rst(*this);
_rst._MyData *= _Right;
return _rst;
}
//输出运算符
friend ostream& operator <<(ostream& os, matrix& _Right);
};
//输出运算符
ostream& operator << (ostream& os, matrix& _Right)
{
os << "matrix: " << endl;
os << "row = " << _Right.row() << "\t" << "col = " << _Right.col() << endl;
for(size_t i=0; i<_Right.row(); i++)
{
for(size_t j=0; j<_Right.col(); j++)
os << _Right[j] << "\t";
os << endl;
}
return os;
}[br][br][以下内容由 sonix 在 2006年07月06日 01:29am 时添加] [br]
|
|