C++ 实现二维矩阵的加减乘等运算

Matrix.h#include "iostream"

using namespace std;

class Matrix
{
    private:
        int row, list;
        double **HL;
    public:
        Matrix(int r_ = 0, int l_ = 0);
        Matrix(int r_, int l_, double **newone);
        Matrix(const Matrix & rhs);
        ~Matrix();
        Matrix operator + (const Matrix & rhs);
        Matrix operator - (const Matrix & rhs);
        Matrix operator = (const Matrix & rhs);
        Matrix operator * (const Matrix & rhs);
        friend ostream & operator << (ostream & os, const Matrix & rhs);
};
Matrix.cpp#include "Matrix.h"
int i, j;
Matrix::Matrix(int r_, int l_):row(r_),list(l_)
{
    HL = new double *[row];
    for(i = 0; i < row; i++)
    {
        HL[i] = new double [list];
    }
    cout<<"please enter Matrix :"<<endl;
    for(i = 0; i < row; i++)
    {
        for(j=0; j<list; j++)
        {
            cin>>HL[i][j];
        }
    }
}

Matrix::Matrix(int r_, int l_, double **newone):row(r_),list(l_) //构造函数重载,
//主要用于加法减法的return使用
{
    HL = new double *[row];
    for(i = 0; i< row; i++)
    {
        HL[i] = new double [list];
    }
    for(i = 0; i <row; i++)
    {
        for(j = 0; j<list; j++)
        {
            HL[i][j] = newone[i][j];
        }
    }
}

Matrix::Matrix(const Matrix & rhs)
{
    if(this != & rhs)
    {
        this->row = rhs.row;
        this->list = rhs.list;
        HL = new double *[row];
        for(i = 0; i<row; i++)
        {
            HL[i] = new double [list];
        }
        for(i = 0; i<row; i++)
        {
            for(j = 0; j<list; j++)
            {
                this->HL[i][j] = rhs.HL[i][j];
            }
        }
    }

}

Matrix::~Matrix() //析构函数,删除开辟的空间
{
    cout<<"~ Matrix : row = "<<row<<", list = "<<list<<endl<<endl;
    for(i = 0; i<row; i++)
    {
        delete [] HL[i];
    }
    delete [] HL;
}

Matrix Matrix::operator + (const Matrix & rhs)
{
    if( (this->row == rhs.row) && (this->list == rhs.list))
    {
        double **newone;
        int r_, l_;
        r_ = row; l_ = list;
        newone = new double *[row];
        for(i = 0; i < row; i++)
        {
            newone[i] = new double [list];
        }
        for(i = 0; i < row; i++)
        {
            for(j = 0; j<list; j++)
            {
                newone[i][j] = HL[i][j]+rhs.HL[i][j];
            }
        }
        return Matrix(r_, l_, newone);
    }
}

Matrix Matrix::operator - (const Matrix & rhs)
{
    if((this->row == rhs.row) && (this->list == rhs.list))
    {
        double **newone;
        int r_, l_;
        r_ = row; l_ = list;
        newone = new double *[row];
        for(i = 0; i<row;i++)
        {
            newone[i] = new double [list];
        }
        for(i=0;i<row;i++)
        {
            for(j = 0; j<list; j++)
            {
                newone[i][j] = HL[i][j]+rhs.HL[i][j];
            }
        }
            return Matrix(r_, l_, newone);
    }

}

Matrix Matrix::operator * (const Matrix& rhs)
{
    if((this->row = rhs.row) && (this->list = rhs.list))
    {
        double **newone;
        int r_, l_;
        r_ = row; l_ = list;
        newone = new double *[row];
        for(i = 0; i<row; i++)
        {
            newone[i]=new double [list];
        }
        for(i = 0;i<row;i++)
        {
            for(j = 0; j<list; j++)
            {
                newone[i][j]=0;
                if(i == j)
                {
                for(int k = 0; k<list; k++)
                {
                    newone[i][j] = newone[i][j] + HL[i][k]*rhs.HL[k][j];
                }
                }
                else
                {
                    for(int k = 0; k<list; k++)
                    {
                        newone[i][j] = newone[i][j] + HL[i][k]*rhs.HL[k][j];
                    }
                }

            }

        }
        return Matrix(r_,l_,newone);
    }
}

Matrix Matrix::operator = (const Matrix & rhs)
{
    if((this->row = rhs.row) && (this->list == rhs.list))
    {
        for(i = 0; i<row; i++)
        {
            for(j = 0; j<list; j++)
            {
                this->HL[i][j] = rhs.HL[i][j];
            }
        }
        return (*this);
    }
}

ostream & operator << (ostream & os, const Matrix & rhs)
{
    os<<"Matrix: row="<<rhs.row<<" , list = "<<rhs.list<<endl;
    for(i = 0; i<rhs.row; i++)
    {
        for(j = 0; j<rhs.list; j++)
        {
            os<<rhs.HL[i][j]<<" ";
        }
        os<<endl;
    }
    return os;
}

int main()
{
    int m,n,x,y;
    cin>>n>>m>>x>>y;
    Matrix aa(n,m), bb(n,m), cc(n,m), dd(x,y);
    cout<<endl<<aa<<endl<<bb<<endl<<cc<<endl<<dd<<endl;
    cout<<(aa+bb+cc)<<endl<<(cc*bb)<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/zhibei/p/12203351.html

时间: 2024-10-09 22:31:55

C++ 实现二维矩阵的加减乘等运算的相关文章

数据结构 二维数组方阵加减乘

#include<stdio.h>int main(){ int A[200][200],B[200][200],sum[200][200]; int m,n,i,j,a,b; printf("请输入行数和列数:\n"); scanf("%d,%d",&m,&n); for(i=0;i<m;i++){  for(j=0;j<n;j++){   printf("请输入A的数值:\n");   scanf(&q

CUDA学习之一:二维矩阵加法

今天忙活了3个小时,竟然被一个苦恼的CUDA小例程给困住了,本来是参照Rachal zhang大神的CUDA学习笔记来一个模仿,结果却自己给自己糊里糊涂,最后还是弄明白了一些. RZ大神对CUDA关于kernel,memory的介绍还是蛮清楚,看完决定写一个二维数组的加法.如果是C++里的加法,那就简单了,用C[i][j] = A[i][j] +B[i][j]就可以. 1 void CppMatAdd(int A[M][N],int B[M][N],int C[M][N]){ 2 for(int

代码题(36)— 搜索二维矩阵

1.74.搜索二维矩阵 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定 target = 5,返回 true. 给定 tar

[Leetcode] search a 2d matrix 搜索二维矩阵

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted from left to right. The first integer of each row is greater than the last integer of the previous ro

LeetCode 240. 搜索二维矩阵 II (C#实现)——二分查找,分治法

问题:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/ 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18,

lintcode 容易题:Search a 2D Matrix 搜索二维矩阵

题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 给出 target = 3,返回 true 挑战 O(log(n) + log(m)) 时间复杂度 解题: 1.最简单的方法就是遍历整个矩阵,时间复杂度:O(log(mn)),这个应该等于O(long(

二维矩阵卷积运算实现

http://z.download.csdn.net/detail/wangfei0117/4408649 http://download.csdn.net/detail/wanwenliang2008/1767686 二维矩阵卷积运算实现,布布扣,bubuko.com

lintcode 中等题:search a 2d matrix II 搜索二维矩阵II

题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复的整数. 样例 考虑下列矩阵: [     [1, 3, 5, 7],     [2, 4, 7, 8],     [3, 5, 9, 10] ] 给出target = 3,返回 2 挑战 要求O(m+n) 时间复杂度和O(1) 额外空间 解题 直接遍历,时间复杂度是O(MN) public

20140920百度笔试题一道之二维矩阵查找

题目: 有这样一个二维矩阵A[N][N],满足j < k时, 1)a[i][j] < a[i][k]; 2)a[j][i] < a[k][i](其实就数据从左上角到右下角纵横方向上都递减),给定一个数target,如何快速搜索是否在这个矩阵中,是的话输出二维坐标,否则输出Null:(不妨假设数据不重复) 比如  12  34  56  78  90  96 13  35  57  79  91  97 14  36  58  80  93  98 15  37  59  81  94