下三角矩阵

**下三角矩阵(lower triangular):**M是一个下三角矩阵,当且仅当i<j时,M(i,j)=0 在一个n行的下三角矩阵中,非0区域的第一行有1个元素,第二行有2个元素,……第n行有个元素。 在一个上三角矩阵中,非0区域的第一行有n个元素,第二行有n-1个元素,……,第n行有1个元素。 这两种三角形非0区域共有n(n+1)/2个非零元素。 考察一个下三角矩阵的元素L(i,j)。如果i<j,则L(i,j)=0; 如果i>=j,则L(i,j)位于非0区域。

lowerTriangularMatrix.cpp

/*
 * 下三角矩阵的测试函数
 * lowerTriangularMatrix.cpp
*/
#include<iostream>
#include"lowertriangularmatrix.h"

using namespace std;

int main(void)
{
    lowerTriangularMatrix<int> x(20);
    x.set(1,1,22);
    x.set(5,3,44);
    x.set(8,5,0);
    x.set(10,2,55);
    x.set(8,5,0);

    cout << x.get(10,2) << endl;
    cout << x.get(5,3) << endl;
    cout << x.get(1,1) << endl;
    cout << x.get(10,14) << endl;
    cout << x.get(8,5) << endl;

    return 0;
}

lowerTriangularMatrix.h

/*
 * 下三角矩阵的类定义
 * lowerTriangularMatrix.h
*/
#ifndef LOWERTRIANGULARMATRIX_H
#define LOWERTRIANGULARMATRIX_H

#include"myexceptions.h"
using namespace std;

template<class T>
class lowerTriangularMatrix
{
  public:
    //构造函数和析构函数
    lowerTriangularMatrix(int theN = 10);
    ~lowerTriangularMatrix(){delete [] element;}

    T get(int,int) const;//获取矩阵中元素
    void set(int,int,const T&);//设置矩阵元素值
private:
    int n;//矩阵非零元素最大个数
    T *element;//矩阵中元素存储所在数组
};

//构造函数
template<class T>
lowerTriangularMatrix<T>::lowerTriangularMatrix(int theN)
{
    if(theN < 1)
        throw illegalParameterValue("Matrix size must be > 0");

    n = theN;
    element = new T [n*(n + 1)/2];
}


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

    if( i >= j)
        //矩阵非零元素按照行主映射方式,第一行元素个数为1,第二行为2,……,第i行为i
        //所以元素在数组中的顺序应该为i*(i-1)/2+j-1
        return element[i*(i - 1)/2+j-1];
    else
        return 0;
}


//set()函数的实现
template<class T>
void lowerTriangularMatrix<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*(i-1)/2+j-1] = newValue;
    else
        if(newValue != 0)
            throw illegalParameterValue
                ("elements not in lower triangle must be zero");
}

#endif // LOWERTRIANGULARMATRIX_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 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

Python花式编程案例锦集(3)

严格来说,本文的2个代码不算花式编程,在Python中就应该是这样写。 1、生成包含20个随机数的列表,然后删除其中的所有奇数。 from random imp...

378130
来自专栏和蔼的张星的图像处理专栏

730. 所有子集的和递归

给一整数 n, 我们需要求前n个自然数形成的集合的所有可能子集中所有元素的和 样例

15920
来自专栏Python小屋

Python符号计算入门及隐函数图像绘制

感谢国防科大刘万伟老师提供了隐函数图像绘制的原始问题以及完美答案,我又补充了一点符号计算的基础知识。 >>> from sympy import * #定义符号...

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

25:最长最短单词

25:最长最短单词 总时间限制: 1000ms 内存限制: 65536kB描述 输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格...

410100
来自专栏算法修养

单调队列,单调栈总结

最近几天接触了单调队列,还接触了单调栈,就总结一下。 其实单调队列,和单调栈都是差不多的数据类型,顾名思义就是在栈和队列上加上单调,单调递增或者单调递减。当...

65380

在Python机器学习中如何索引、切片和重塑NumPy数组

在Python中,数据几乎被普遍表示为NumPy数组。

76590
来自专栏desperate633

LintCode 旋转字符串题目分析代码

样例 对于字符串 "abcdefg". offset=0 => "abcdefg" offset=1 => "gabcdef" offset=2 => ...

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

洛谷 P1313 计算系数

题目描述 给定一个多项式 ,请求出多项式展开后 项的系数。 输入输出格式 输入格式: 输入文件名为factor.in。 共一行,包含5 个整数,分别为 a...

32930
来自专栏Bingo的深度学习杂货店

Q152 Maximum Product Subarray

Find the contiguous subarray within an array (containing at least one number) wh...

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

1019. 分段函数

1019. 分段函数 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB  具体限制  题目描述 编写程序,计算下列分段...

32550

扫码关注云+社区

领取腾讯云代金券