🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
LowerMatrix.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include <malloc.h> // for malloc, free
25#include <string.h> // for memset
26
27AST_NAMESPACE_BEGIN
28
37template<typename _Scalar>
39{
40public:
41 LowerMatrix() : rowcol_{0}, data_{nullptr} {}
42 LowerMatrix(const LowerMatrix& other);
43 LowerMatrix& operator=(const LowerMatrix& other);
44 LowerMatrix(LowerMatrix&& other) noexcept;
45 LowerMatrix& operator=(LowerMatrix&& other) noexcept;
47 void resize(size_t rowcol);
48 size_t row() const { return rowcol_; }
49 size_t col() const { return rowcol_; }
50 _Scalar operator()(size_t row, size_t col) const noexcept {return data_[index(row, col)]; }
51 _Scalar& operator()(size_t row, size_t col) noexcept {return data_[index(row, col)]; }
52 void setZero() noexcept;
53protected:
54 static constexpr size_t index(size_t row, size_t col) noexcept { return row*(row+1)/2 + col; }
55 static constexpr size_t capacity(size_t nrowcol) noexcept { return nrowcol * (nrowcol + 1) / 2; }
56protected:
57 size_t rowcol_;
58 _Scalar* data_;
59};
60
61template <typename _Scalar>
63{
64 if(data_)
65 free(data_);
66}
67
68template <typename _Scalar>
69inline void LowerMatrix<_Scalar>::resize(size_t rowcol)
70{
71 if (rowcol > rowcol_)
72 {
73 if(data_)
74 free(data_);
75 data_ = (_Scalar*)malloc(sizeof(_Scalar) * capacity(rowcol));
76 }
77 rowcol_ = rowcol;
78}
79
80template <typename _Scalar>
81inline LowerMatrix<_Scalar>::LowerMatrix(const LowerMatrix &other)
82 :LowerMatrix()
83{
84 resize(other.rowcol_);
85 memcpy(data_, other.data_, sizeof(_Scalar) * capacity(rowcol_));
86}
87
88template <typename _Scalar>
89inline LowerMatrix<_Scalar> &LowerMatrix<_Scalar>::operator=(const LowerMatrix &other)
90{
91 if(this != &other)
92 {
93 resize(other.rowcol_);
94 memcpy(data_, other.data_, sizeof(_Scalar) * capacity(rowcol_));
95 }
96 return *this;
97}
98
99template <typename _Scalar>
100inline LowerMatrix<_Scalar>::LowerMatrix(LowerMatrix &&other) noexcept
101{
102 rowcol_ = other.rowcol_;
103 data_ = other.data_;
104 other.rowcol_ = 0;
105 other.data_ = nullptr;
106}
107
108template <typename _Scalar>
109inline LowerMatrix<_Scalar> &LowerMatrix<_Scalar>::operator=(LowerMatrix &&other) noexcept
110{
111 if(this != &other)
112 {
113 std::swap(rowcol_, other.rowcol_);
114 std::swap(data_, other.data_);
115 }
116 return *this;
117}
118template <typename _Scalar>
119inline void LowerMatrix<_Scalar>::setZero() noexcept
120{
121 memset(data_, 0, sizeof(_Scalar) * capacity(rowcol_));
122}
123
124
125typedef LowerMatrix<double> LowerMatrixd;
126
129AST_NAMESPACE_END
130
下三角矩阵
定义 LowerMatrix.hpp:39
_Scalar * data_
矩阵数据
定义 LowerMatrix.hpp:58
size_t rowcol_
矩阵行数/列数
定义 LowerMatrix.hpp:57