对角矩阵

对角矩阵(diagonal):M是一个对角矩阵,则当且仅当i≠j时,M(i,j)=0。 一个rows×rows的对角矩阵D可以表示为 一个二维数组element[rows][rows],其中element[i-1][j-1]表示D(i,j)。 这种表示法需要rows²个数据类型为T的数据空间。 对角矩阵最多含有rows个非0元素,因此可以用一维数组element[rows]来表示对角矩阵,其中element[i-1]表示D(i,i) 所有未在一维数组中出现的矩阵元素均为0.这种表示法仅仅需要rows个类型为T的数据空间。

diagonalMatrix.cpp

/*
 * 对角矩阵测试函数的主函数
 * diagonalMatrix.cpp
*/
#include<iostream>
#include"diagonalmatrix.h"

using namespace std;

int main(void)
{
    diagonalMatrix<int> x(20);
    x.set(1,1,22);
    x.set(5,5,44);
    x.set(8,5,0);

    cout<<x.get(5,5) <<endl;
    cout<<x.get(1,1) <<endl;
    cout<<x.get(10,1) <<endl;

    return 0;
}

diagonalMatrix.h

/*
 * 对角矩阵
 * diagonalMatrix.h
*/
#ifndef DIAGONALMATRIX_H
#define DIAGONALMATRIX_H

#include"myexceptions.h"

template<class T>
class diagonalMatrix
{
public:
    diagonalMatrix(int theN = 10);
    ~diagonalMatrix(){delete [] element;}
    T get(int,int) const;
    void set(int,int,const T&);
private:
    int n;
    T* element;
};

//构造函数的具体实现
template<class T>
diagonalMatrix<T>::diagonalMatrix(int theN)
{
    if(theN < 1)
        throw illegalParameterValue("Matrix size must be > 0");

    n = theN;
    element = new T [n];
}


//get()函数的具体实现
template<class T>
T diagonalMatrix<T>::get(int i, int j) const
{
    if(i < 1 || j < 1 || i > n || j > n)
        throw matrixIndexOutOfBounds();

    if(i == j)
        return element[i - 1];
    else
        return 0;
}

//set()函数的具体实现
template<class T>
void diagonalMatrix<T>::set(int i, int j, const T& newValue)
{
    if(i<1 || j < 1 || i > n || j > n)
        throw matrixIndexOutOfBounds();
    if(i == j)
        element[i-1] = newValue;
    else
        if(newValue != 0)
            throw illegalParameterValue
                ("Nondiagonal elements must be zero");
}

#endif // DIAGONALMATRIX_H

myExceptions.h

/*
 *异常类
 *myExceptions.h
*/
#ifndef MYEXCEPTIONS_H
#define MYEXCEPTIONS_H
#include<string>

using namespace std;


//不合法的参数值
class illegalParameterValue
{
public:
    illegalParameterValue(string theMessage = "Illegal parameter value")
    {
        message = theMessage;
    }
    void outputMessage()
    {
        cout <<message<<endl;
    }
private:
    string message;
};

//数组索引不合法
class matrixIndexOutOfBounds
{
public:
    matrixIndexOutOfBounds(string theMessage = "Matrix index out of bounds")
    {
        message = theMessage;
    }
    void outputMessage()
    {
        cout << message <<endl;
    }
private:
    string message;
};

//数组大小不匹配
class matrixSizeMismatch
{
public:
    matrixSizeMismatch(string theMessage =
            "The size of the two matrics doesn't match")
    {
        message = theMessage;
    }
    void outputMessage()
    {
        cout << message <<endl;
    }
private:
    string message;
};


#endif // MYEXCEPTIONS_H

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

python科学计算之numpy

1.np.logspace(start,stop,num): 函数表示的意思是;在(start,stop)间生成等比数列num个 eg:  import num...

38160
来自专栏Python小屋

Python标准库random用法精要

random标准库主要提供了伪随机数生成函数和相关的类,同时也提供了SystemRandom类(也可以直接使用os.urandom()函数)来支持生成加密级别要...

31160
来自专栏数说工作室

函数玩一玩 | 【SAS Says·扩展篇】IML:2.函数

【SAS Says·扩展篇】IML 分6集,回复【SASIML】查看全部: 入门 | SAS里的平行世界 函数 | 函数玩一玩 编程 | IML的条件与循环 模...

39190
来自专栏数据处理

TensorFlow入门1-minist

17930
来自专栏python读书笔记

《python算法教程》Day10 - 平面最近点对问题平面最小点对问题介绍代码演示

今天是《python算法教程》的第10篇读书笔记。笔记的主要内容是使用python实现求最小点对的时间复杂度为O(nlogn)的算法。 平面最小点对问题介绍 在...

705120
来自专栏专知

【干货】seq2seq模型实例:用Keras实现机器翻译

【导读】近日,人工智能学者Ravindra Kompella发表一篇博客,介绍了作者实现的基于keras的机器翻译例子。作者通过一个seq2seq编码器-解码器...

80680
来自专栏mathor

matlab—基本操作与矩阵输入

还有一个月就美赛了,本系列文章适用于完全没有任何matlab基础,但是有别的编程语言基础的人看,我会结合自己的理解,有的放矢的讲,不会掺杂很多废话,各位读者轻喷...

12910
来自专栏李智的专栏

Deep learning基于theano的keras学习笔记(1)-Sequential模型

《统计学习方法》中指出,机器学习的三个要素是模型,策略和优算法,这当然也适用于深度学习,而我个人觉得keras训练也是基于这三个要素的,先建立深度模型,然后选用...

10310
来自专栏利炳根的专栏

学习笔记DL004:标量、向量、矩阵、张量,矩阵、向量相乘,单位矩阵、逆矩阵

线性代数,面向连续数学,非离散数学。《The Matrix Cookbook》,Petersen and Pedersen,2006。Shilov(1977)。

40900
来自专栏数据结构与算法

P2258 子矩阵

题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵。 例如,下面左图中选取...

29490

扫码关注云+社区

领取腾讯云代金券