栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ 矩阵类

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ 矩阵类

#include
using namespace std;

template

//模板参数并非常见的T,下面会说明原因
class Matrix {
public:
Matrix(int row, int col);
//Matrix(const Matrix& m);
~Matrix();
int Row()const { return m_row; }
int Col()const { return m_col; }
double& operator()(int row, int col);
double operator() (int row, int col)const;
void datacin(const Matrix& m);
void print(const Matrix& m);

//下式中运算符重载的函数前加上了template ,这是在模板条件下重载运算符时保证安全(消除warning)的做法,实际上是可以不加的

//也正因友元函数不属于类,友元函数模板参数也需跟类模板的参数区分开,所以一个用了U 一个用了T。当然,也可以把两者理解成不同的形参
template  friend Matrix operator+(const Matrix& m1, const Matrix& m2) ;


template  friend Matrix operator-(const Matrix&m1 , const Matrix&m2 );
template  friend Matrix operator*(const Matrix& m1, const Matrix& m2);


private:
double** data;

// 二维指针—二维数组
int m_row;//矩阵的行
int m_col;//矩阵的列

};
template
Matrix::Matrix(int row, int col) {
m_row = row;
m_col = col;
data = new double* [row];
for (int i = 0; i < row; i++) {
data[i] = new double[col];

for (int j = 0; j < col; j++) {

data[i][j] = 0;

}
}
}

template
Matrix::~Matrix() 
{
for (int i = 0; i < m_row; i++) {
delete[]data[i];
}
delete[]data;
}

template
double& Matrix::operator()(int row, int col) 
{
if (row >= m_row || col >= m_col) {
cout << "Wrong!" << endl;
}
return data[row][col];
}
template
double Matrix::operator()(int row, int col) const
{
if (row >= m_row || col >= m_col) {
cout << "Wrong!" << endl;
}
return data[row][col];
}
template
Matrix operator+(const Matrix& m1, const Matrix& m2) {
if (m1.Col() != m2.Col() || m1.Row() != m2.Row()) {
cout << "Wrong!" << endl;
}

Matrix addmar(m1.Row(), m1.Col());
for (int i = 0; i < m1.Row(); i++) {

for (int j = 0; j < m1.Col(); j++) {
addmar(i, j) = m1(i, j) + m2(i, j);
}
}
return addmar;
}

template
Matrix operator-(const Matrix& m1, const Matrix& m2) {
if (m1.Col() != m2.Col() || m1.Row() != m2.Row()) {
cout << "Wrong!" << endl;
}
Matrix submar(m1.Row(), m1.Col());
for (int i = 0; i < m1.Row(); i++) {
for (int j = 0; j < m1.Col(); j++) {
submar(i, j) = m1(i, j) - m2(i, j);
}
}
return submar;

}
template
Matrix operator*(const Matrix& m1, const Matrix& m2) {
if (m1.Col() != m2.Row()) {
cout << "Wrong!" << endl;
}
Matrix mulmar(m1.Row(), m1.Col());
for (int i = 0; i < m1.Row(); i++) {
for (int j = 0; j < m2.Col(); j++) {
for (int k = 0; k < m2.Row(); k++) 
{
mulmar(i,j) += m1(i, k) * m2(k, j);
}
}
}
return mulmar;
}
template
void Matrix::datacin(const Matrix& m) {
for (int i = 0; i < m.Row(); i++) {
for (int j = 0; j < m.Col(); j++) {
cin >> m.data[i][j];
}
}
}
template
void Matrix:: print(const Matrix&m)
{
for (int i = 0; i < m.Row(); i++) {
for (int j = 0; j < m.Col(); j++) {
cout << m.data[i][j] <<" ";
}
puts("");
}

}
int main() 
{
int r1, c1;
cout << "输入矩阵的行和列:";
cin >> r1 >> c1;
Matrix m1(r1, c1);
cout << "输入int数据" << endl;
m1.datacin(m1);
// m1.print(m1);

int r2, c2;
cout << "输入矩阵的行和列:";
cin >> r2 >> c2;
Matrix m2(r2, c2);
cout << "输入int数据" << endl;
m2.datacin(m2);
//m2.print(m2);

Matrix m3= m1 + m2;

m3.print(m3);
}

 

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号