SLISC 的密矩阵类

             

  • 本词条处于草稿阶段.
预备知识 SLISC 库简介,数据结构:密矩阵,C++ 类的定义和继承

   我们先以双精度类型 Doub(即 double)来举例介绍 SLISC 中的密矩阵.我们习惯上也把 1 维的矩阵称为矢量.

1. Vbase 类

   所有密矩阵都继承于 VbaseDoubVbaseDoub 不直接使用,仅用于继承.这里使用继承主要是为了避免在每个密矩阵中都重复定义这些基础功能.

class VbaseDoub
{
protected:
    Doub *m_p;
    Long m_N;
public:
    typedef Doub value_type;
    VbaseDoub();
    explicit VbaseDoub(Long_I N);
    VbaseDoub(const VbaseDoub &rhs);

    Doub* p();
    const Doub* p() const;
    Long size() const;
    void resize(Long_I N);
    Doub &operator[](Long_I i);
    const Doub &operator[](Long_I i) const;
    Doub& end();
    const Doub& end() const;
    Doub& end(Long_I i);
    const Doub& end(Long_I i) const;
    void operator<<(VbaseDoub &rhs);
    ~VbaseDoub();
};

   简单来说,VbaseDoub 就是一个简单的 std::vector,负责内存管理,用方括号 [i] 获取第 i 个矩阵元,用 end() 获取最后一个元,end(i) 获取第 N-i 个元.用 .size() 获取元素长度,.resize(N) 释放内存并重新分配 N 个元素的新内存.<< 用于把一个对象所分配的内存转移到另一个对象中.所有继承 VbaseDoub 的米矩阵都具有这些功能,除了 resize() 会根据矩阵的维度重新定义.

2. Vec 矢量

   为了避免歧义,任何两个矩阵之间禁止使用等号.如果要复制使用 copy() 函数.

class VecDoub : public VbaseDoub
{
public:
    typedef VbaseDoub Base;
    VecDoub() = default;
    explicit VecDoub(Long_I N);
    VecDoub(const VecDoub &rhs);
    VecDoub &operator=(const VecDoub &rhs) = delete;
    void operator<<(VecDoub &rhs);
};

3. Cmat 矩阵

class CmatDoub : public VbaseDoub
{
protected:
    typedef VbaseDoub Base;
    Long m_N0, m_N1;
public:
    CmatDoub(): m_N0(0), m_N1(0) {};
    CmatDoub(Long_I N1, Long_I N2);
    CmatDoub(const CmatDoub &rhs);
    CmatDoub &operator=(const CmatDoub &rhs) = delete;
    void operator<<(CmatDoub &rhs);
    Doub& operator()(Long_I i, Long_I j);
    const Doub& operator()(Long_I i, Long_I j) const;
    Long n0() const;
    Long n1() const;
    void resize(Long_I N1, Long_I N2);
    void reshape(Long_I N1, Long_I N2);
};

4. Cmat3 三维数组

class Cmat3Doub : public VbaseDoub
{
protected:
    typedef VbaseDoub Base;
    Long m_N0, m_N1, m_N2;
public:
    typedef Doub value_type;
    Cmat3Doub(): m_N0(0), m_N1(0), m_N2(0) {};
    Cmat3Doub(Long_I N1, Long_I N2, Long_I N3);
    Cmat3Doub(const Cmat3Doub &rhs);
    Cmat3Doub &operator=(const Cmat3Doub &rhs) = delete;
    void operator<<(Cmat3Doub &rhs);
    void resize(Long_I N1, Long_I N2, Long_I N3);
    void reshape(Long_I N1, Long_I N2, Long_I N3);
    Doub &operator()(Long_I i, Long_I j, Long_I k);
    const Doub &operator()(Long_I i, Long_I j, Long_I k) const;
    Long n0() const;
    Long n1() const;
    Long n2() const;
};

  

未完成:列出其他矩阵

致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择会员制,大量广告,内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证网站能在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

广告位

投放详情

         

© 小时科技 保留一切权利