问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

...运算符+,-,*,~等分别实现矩阵的加减乘和转置运算

发布网友 发布时间:2024-01-03 22:16

我来回答

1个回答

热心网友 时间:2024-08-14 14:24

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <ctime>
using namespace std;
template <class T>
class Matrix {
    public:
        int m, n;
    private:
        T* data;
    public:
        //constructor
        Matrix(int r=0, int c=0): m(r), n(c) {
            if (r>0 && c>0) {
                data = new T[m*n];
                if (data==NULL) {
                    cerr<<"Allocate memory failed!"<<endl;
                    exit(1);
                }
                memset(data, 0, m*n*sizeof(T));
            } else
                data = NULL;
        }
        //deconstructor
        ~Matrix() {
            m = n = 0;
            delete[] data;
            data = NULL;
        }
        //entry access
        T& operator() (int i, int j) {
            assert(i>=0 && i<m && j>=0 && j<n);
            return data[i+j*m];
        }
        //assign
        Matrix<T>& operator= (Matrix<T> a) {
            m = a.m;    n = a.n;
            data = new T[m*n*sizeof(T)];
            if (data==NULL) {
                cerr<<"Allocate memory failed!"<<endl;
                exit(1);
            }
            for (int i=0; i<m; i++)
                for (int j=0; j<n; j++)
                    data[i+j*m] = a(i, j);
            return *this;
        }
        //display
        void display() {
            cout<<"("<<m<<", "<<n<<"):"<<endl;
            for (int i=0; i<m; i++) {
                for (int j=0; j<n; j++)
                    cout<<data[i+j*m]<<"\t";
                cout<<endl;
            }
        }
};
template<class T> 
inline Matrix<T> operator+ (Matrix<T>& a, Matrix<T>& b)
{
    assert(a.m==b.m && a.n==b.n);
    Matrix<T> r(a.m, a.n);
    for (int i=0; i<a.m; i++)
        for (int j=0; j<a.n; j++)
            r(i, j) = a(i, j) + b(i, j);
    return r;
}

template<class T> 
inline Matrix<T> operator- (Matrix<T>& a, Matrix<T>& b)
{
    assert(a.m==b.m && a.n==b.n);
    Matrix<T> r(a.m, a.n);
    for (int i=0; i<a.m; i++)
        for (int j=0; j<a.n; j++)
            r(i, j) = a(i, j) - b(i, j);
    return r;
}
template<class T> 
inline Matrix<T> operator* (Matrix<T>& a, Matrix<T>& b)
{
    assert(a.n==b.m);
    Matrix<T> r(a.m, b.n);
    for (int i=0; i<a.m; i++)
        for (int j=0; j<b.n; j++)
            for (int k=0; k<a.n; k++)
                r(i, j) += a(i, k) * b(k, j);
    return r;
}

测试程序:
/* 
 * 测试 mat.h 中定义的矩阵类
 */
#include "mat.h"
int main()
{
    int m = 2, n = 2;
    Matrix<double> a(m, n);
    Matrix<double> b(m, n);
    srand( unsigned(time(NULL)) );
    for (int i=0; i<m; i++)
        for (int j=0; j<n; j++) {
            a(i, j) = double(rand())/RAND_MAX;
            b(i, j) = double(rand())/RAND_MAX;
        }
    cout<<"Matrix a"; a.display(); cout<<endl;
    cout<<"Matrix b"; b.display(); cout<<endl;
    Matrix<double> c(m, n);
    c = a+b;
    cout<<"a+b: "; c.display(); cout<<endl;
    Matrix<double> d(m, n);
    d = a*b;
    cout<<"a*b:"; d.display(); cout<<endl;
    
    return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
郎酒怎么分辨真假 郎酒买到假的怎么赔偿 如何除掉衣服上的超能胶迹 有什么方法洗掉"502超能胶水"??? 我想买块两三千元的玉,但又不知是否真假.不知玉器鉴别是怎样鉴的? 申请留学时间流程 95595光大银行,光大乐迷联名信用卡金卡额度多少 光大乐视卡是什么信用卡? 乐迷信用卡普卡额度大概是多少? ...sport的英语小作文,主题“打乒乓球”。初中水平 ps怎么画方框(ps怎么画方框线条) 变速箱油不换会有什么症状? 十全电器商贸中心? 有没有讷木这个词 学广告设计,要学摄影的,选一部单反相机。 我一张身份证实名两个,对另一个的支付功能有影响吗?_百 ... 男友用2个和我聊天,什么动机? 为什么我的发朋友圈无法创建自己的位置也无法搜索? 微信手机号在24小时内,已绑定两个,已达到限制,不能在绑定其他微信... 哪位大神有爱的曝光 2008年由西岛隆弘 Takahiro Nishijima主演的百度 ... 为什么我同一身份名下的两个 一个零钱支付限额了另一个却没... 数学行程问题!!天呐。。。 一年改2次的办法 索尼RX1RM2显示屏怎么样? 绍兴碧桂园凤鸣春江绿化率是多少? 我发现我对象有两个,而且那个号上都是女的,还说一些暧昧的话... 曹操和董卓的故事 大同学府华庭绿化率是多少? 我男朋友的有两个,怎么回事呀? 喉咙不舒服,总要呕吐,喉咙不痛不痒,没有异物感,不影响吃饭喝水,就是... ...还有想吐的感觉?怎么回事 近排老是这样 男生 西门子断电之前怎么发送信号 索尼RX1RM2的超高像素有什么用?感觉生活中不是很实用呢。 江西男子偷显卡被老板殴打后从23楼一跃而下,谁该为男子的死负责?_百 ... 雪铁龙06款凯旋中控显示屏的时间怎么调 如何用一个手机号注册两个? 怎么一年内修改两次怎样才能一年修改两次? 中国卫生人才网个人中心在哪 到老公亲戚家做客老公一家人不帮我占位吃饭对吗? 有QQ号和,但不是好友,怎么加他的抖音? 微信手机号在24小时内,已绑定两个,已达到限制,不能在绑定其他微信... 知道一个人的,但不是好友。怎么加他的抖音 ...网络体系结构与协议标准趋于统一,国际标准化组织建立了()参考模型... 合伙退股的法律规定 摩托车有离合器的省油还是没有的省油啊 苹果手机怎么才能用两个! 一年内怎么改第二次 疑难求问: 新水浒Q传(即大话水浒) 2008北京奥运会我国体育健儿夺得了51金的骄人成绩……修改病句_百度知 ... 办过银行卡但银行卡自己扣费我就解除绑定就不用了那样没事吗?_百度... 华为手机怎么样注册