21 using NestedType = TMatrix;
22 using ScalarType =
typename NestedType::ScalarType;
23 using SelfType = ConstSubMatrix<NestedType, M, N>;
25 static auto constexpr kRows = M;
26 static auto constexpr kCols = N;
27 static bool constexpr bRowMajor = NestedType::bRowMajor;
29 PBAT_HOST_DEVICE ConstSubMatrix(NestedType
const& _A,
int _ib,
int _jb) : A(_A), ib(_ib), jb(_jb)
32 NestedType::kRows >= M and NestedType::kCols >= N and M > 0 and N > 0,
33 "Invalid submatrix dimensions");
36 PBAT_HOST_DEVICE
constexpr auto Rows()
const {
return kRows; }
37 PBAT_HOST_DEVICE
constexpr auto Cols()
const {
return kCols; }
39 PBAT_HOST_DEVICE ScalarType operator()(
auto i,
auto j)
const {
return A(ib + i, jb + j); }
42 PBAT_HOST_DEVICE ScalarType operator()(
auto i)
const {
return (*
this)(i % kRows, i / kRows); }
43 PBAT_HOST_DEVICE ScalarType operator[](
auto i)
const {
return (*
this)(i); }
45 template <auto S, auto T>
46 PBAT_HOST_DEVICE ConstSubMatrix<SelfType, S, T> Slice(
auto i,
auto j)
const
48 return ConstSubMatrix<SelfType, S, T>(*
this, i, j);
50 PBAT_HOST_DEVICE ConstSubMatrix<SelfType, kRows, 1> Col(
auto j)
const
52 return Slice<kRows, 1>(0, j);
54 PBAT_HOST_DEVICE ConstSubMatrix<SelfType, 1, kCols> Row(
auto i)
const
56 return Slice<1, kCols>(i, 0);
72 using NestedType = TMatrix;
73 using ScalarType =
typename NestedType::ScalarType;
74 using SelfType = SubMatrix<NestedType, M, N>;
76 static auto constexpr kRows = M;
77 static auto constexpr kCols = N;
78 static bool constexpr bRowMajor = NestedType::bRowMajor;
80 PBAT_HOST_DEVICE SubMatrix(NestedType& _A,
int _ib,
int _jb) : A(_A), ib(_ib), jb(_jb)
83 NestedType::kRows >= M and NestedType::kCols >= N and M > 0 and N > 0,
84 "Invalid submatrix dimensions");
87 template <
class TOtherMatrix>
88 PBAT_HOST_DEVICE SelfType& operator=(TOtherMatrix&& B)
90 Assign(*
this, std::forward<TOtherMatrix>(B));
94 PBAT_HOST_DEVICE
auto Rows()
const {
return kRows; }
95 PBAT_HOST_DEVICE
auto Cols()
const {
return kCols; }
97 PBAT_HOST_DEVICE ScalarType operator()(
auto i,
auto j)
const {
return A(ib + i, jb + j); }
98 PBAT_HOST_DEVICE ScalarType& operator()(
auto i,
auto j) {
return A(ib + i, jb + j); }
101 PBAT_HOST_DEVICE ScalarType operator()(
auto i)
const {
return (*
this)(i % kRows, i / kRows); }
102 PBAT_HOST_DEVICE ScalarType& operator()(
auto i) {
return (*
this)(i % kRows, i / kRows); }
103 PBAT_HOST_DEVICE ScalarType operator[](
auto i)
const {
return (*
this)(i); }
104 PBAT_HOST_DEVICE ScalarType& operator[](
auto i) {
return (*
this)(i); }
106 template <auto S, auto T>
107 PBAT_HOST_DEVICE
auto Slice(
auto i,
auto j)
109 return SubMatrix<SelfType, S, T>(*
this, i, j);
111 PBAT_HOST_DEVICE
auto Col(
auto j) {
return Slice<kRows, 1>(0, j); }
112 PBAT_HOST_DEVICE
auto Row(
auto i) {
return Slice<1, kCols>(i, 0); }
114 template <auto S, auto T>
115 PBAT_HOST_DEVICE
auto Slice(
auto i,
auto j)
const
119 PBAT_HOST_DEVICE
auto Col(
auto j)
const {
return Slice<kRows, 1>(0, j); }
120 PBAT_HOST_DEVICE
auto Row(
auto i)
const {
return Slice<1, kCols>(i, 0); }
125 void SetConstant(
auto k) { AssignScalar(*
this, k); }