24#include "AstMath/MathOperator.hpp"
25#include "AstMath/Vector.hpp"
36template<
typename _Scalar>
41 Matrix(
size_t row,
size_t col);
47 void resize(
size_t row,
size_t col);
49 size_t size()
const{
return row_ * col_;}
50 size_t row()
const{
return row_;}
51 size_t col()
const{
return col_;}
52 _Scalar* data()
const{
return data_;}
53 _Scalar& operator()(
size_t row,
size_t col){
return data_[row * col_ + col];}
54 _Scalar operator()(
size_t row,
size_t col)
const{
return data_[row * col_ + col];}
63template <
typename _Scalar>
70template <
typename _Scalar>
71inline Matrix<_Scalar>::Matrix(
size_t row,
size_t col)
76 data_ = (_Scalar*)malloc(row * col *
sizeof(_Scalar));
80template <
typename _Scalar>
81inline Matrix<_Scalar>::~Matrix()
87template <
typename _Scalar>
88inline Matrix<_Scalar>::Matrix(
const Matrix& other)
94 this->data_ = (_Scalar*)malloc(other.size() * sizeof(_Scalar));
97 memcpy(data_, other.data_, other.size() * sizeof(_Scalar));
109template <
typename _Scalar>
110inline Matrix<_Scalar>& Matrix<_Scalar>::operator=(
const Matrix& other)
113 resize(other.row(), other.col());
115 memcpy(data_, other.data_, other.size() *
sizeof(_Scalar));
121template <
typename _Scalar>
122inline Matrix<_Scalar>::Matrix(Matrix&& other)
125 , data_{other.data()}
129 other.data_ =
nullptr;
132template <
typename _Scalar>
133inline Matrix<_Scalar>& Matrix<_Scalar>::operator=(Matrix&& other)
136 std::swap(row_, other.row_);
137 std::swap(col_, other.col_);
138 std::swap(data_, other.data_);
143template <
typename _Scalar>
144inline void Matrix<_Scalar>::resize(
size_t row,
size_t col)
150 data_ = (_Scalar*)malloc(row * col *
sizeof(_Scalar));
154template <
typename _Scalar>
155inline void Matrix<_Scalar>::setZero()
158 memset(data_, 0, size() *
sizeof(_Scalar));
162template<
typename _Scalar,
size_t Row,
size_t Col>
167 typedef _Scalar Scalar;
169 constexpr size_t size()
const{
return Row*Col;}
170 constexpr size_t row()
const{
return Row;}
171 constexpr size_t col()
const{
return Col;}
172 constexpr Scalar* data()
const{
return (Scalar*)
this;}
173 Scalar operator[](
size_t idx)
const{
return data()[idx];}
174 Scalar& operator[](
size_t idx) {
return data()[idx];}
175 Scalar operator()(
size_t idx)
const {
return data()[idx]; }
176 Scalar& operator()(
size_t idx) {
return data()[idx]; }
177 Scalar operator()(
size_t row,
size_t col)
const {
return data_[row][col]; }
178 Scalar& operator()(
size_t row,
size_t col) {
return data_[row][col]; }
181 Scalar data_[Row][Col];
185template<
typename _Scalar>
189 enum {Row = 3, Col = 3};
191 typedef _Scalar Scalar;
192 static Self Identity(){
return Self{1,0,0,0,1,0,0,0,1};}
193 static Self Zero(){
return Self{0,0,0,0,0,0,0,0,0};}
195 constexpr size_t size()
const{
return Row*Col;}
196 constexpr size_t row()
const{
return Row;}
197 constexpr size_t col()
const{
return Col;}
198 constexpr Scalar* data()
const{
return (Scalar*)
this;}
199 Scalar operator[](
size_t idx)
const{
return data()[idx];}
200 Scalar& operator[](
size_t idx) {
return data()[idx];}
201 Scalar operator()(
size_t idx)
const {
return data()[idx]; }
202 Scalar& operator()(
size_t idx) {
return data()[idx]; }
203 Scalar operator()(
size_t row,
size_t col)
const {
return data_[row][col]; }
204 Scalar& operator()(
size_t row,
size_t col) {
return data_[row][col]; }
206 Self transpose()
const;
207 void transposeInPlace();
208 void setIdentity(){*
this = Identity();}
209 Self& operator*=(
const Self& other);
212 Scalar data_[Row][Col];
219template <
typename _Scalar>
223 data_[0][0], data_[1][0], data_[2][0],
224 data_[0][1], data_[1][1], data_[2][1],
225 data_[0][2], data_[1][2], data_[2][2],
229template <
typename _Scalar>
230A_ALWAYS_INLINE
void MatrixMN<_Scalar, 3, 3>::transposeInPlace()
232 std::swap(data_[0][1], data_[1][0]);
233 std::swap(data_[0][2], data_[2][0]);
234 std::swap(data_[1][2], data_[2][1]);
237template <
typename _Scalar>
238A_ALWAYS_INLINE
typename MatrixMN<_Scalar, 3, 3>::Self &MatrixMN<_Scalar, 3, 3>::operator*=(
const Self &other)
240 using namespace _AST math;
241 *
this = operator*(*
this, other);
249AST_DECL_TYPE_ALIAS(Matrix3d)
250AST_DECL_TYPE_ALIAS(Matrix6d)