Skip to content

Commit b245eed

Browse files
committed
Identity, Zero, Ones static methods to accept Scalar type, SVD type systems avoids to force forward declare defaults template parameters outside spd.h
1 parent c02d659 commit b245eed

File tree

6 files changed

+144
-117
lines changed

6 files changed

+144
-117
lines changed

fdaPDE/src/linear_algebra/bool.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -312,18 +312,18 @@ class Matrix<bool, Rows_, Cols_, StorageOrder_> :
312312
return;
313313
}
314314
// static named constructors
315-
static constexpr auto Zero() { return ZeroMatrix<Rows_, Cols_>(); }
315+
static constexpr auto Zero() { return ZeroMatrix<bool, Rows_, Cols_>(); }
316316
static constexpr auto Zero(int rows) {
317317
fdapde_static_assert(Rows_ == 1 || Cols_ == 1, THIS_METHOD_IS_FOR_ROW_OR_COLUMN_VECTORS_ONLY);
318-
return ZeroMatrix<Dynamic, Dynamic>(rows, 1);
318+
return ZeroMatrix<bool, Dynamic, Dynamic>(rows, 1);
319319
}
320-
static constexpr auto Zero(int rows, int cols) { return ZeroMatrix<Dynamic, Dynamic>(rows, cols); }
321-
static constexpr auto Ones() { return OnesMatrix<Rows_, Cols_>(); }
320+
static constexpr auto Zero(int rows, int cols) { return ZeroMatrix<bool, Dynamic, Dynamic>(rows, cols); }
321+
static constexpr auto Ones() { return OnesMatrix<bool, Rows_, Cols_>(); }
322322
static constexpr auto Ones(int rows) {
323323
fdapde_static_assert(Rows_ == 1 || Cols_ == 1, THIS_METHOD_IS_FOR_ROW_OR_COLUMN_VECTORS_ONLY);
324-
return OnesMatrix<Dynamic, Dynamic>(rows, 1);
324+
return OnesMatrix<bool, Dynamic, Dynamic>(rows, 1);
325325
}
326-
static constexpr auto Ones(int rows, int cols) { return OnesMatrix<Dynamic, Dynamic>(rows, cols); }
326+
static constexpr auto Ones(int rows, int cols) { return OnesMatrix<bool, Dynamic, Dynamic>(rows, cols); }
327327
// observers
328328
constexpr int bitpacks() const { return bitpacks_; }
329329
constexpr bitpack_t bitpack(int i) const { return data_[i]; }

fdaPDE/src/linear_algebra/evd.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ template <typename XprType_> class EVD {
3838
householder_tridiagonalize_(const XprType& m) const {
3939
const int n = m.rows();
4040
Matrix<Scalar, Rows, Cols> T = m;
41-
Matrix<Scalar, Rows, Cols> Q = IdentityMatrix<Rows, Cols>(n, n);
41+
Matrix<Scalar, Rows, Cols> Q = IdentityMatrix<Scalar, Rows, Cols>(n, n);
4242

4343
for (int k = 0; k < n - 2; ++k) {
4444
const int m = n - k - 1;
@@ -89,7 +89,7 @@ template <typename XprType_> class EVD {
8989
auto [T, Q_] = householder_tridiagonalize_(mtx.derived());
9090
const int n = T.rows();
9191
const int max_iter = max_iter_ * n;
92-
Matrix<Scalar, Rows, Cols> Q = IdentityMatrix<Rows, Cols>(n, n);
92+
Matrix<Scalar, Rows, Cols> Q = IdentityMatrix<Scalar, Rows, Cols>(n, n);
9393
// extract diagonal and subdiagonal
9494
Vector<Scalar, Rows> dd;
9595
Vector<Scalar, Rows == Dynamic ? Dynamic : (Rows - 1)> sd;

fdaPDE/src/linear_algebra/matrix.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,13 @@ struct ProceduralMatrix : public MatrixExpr<ProceduralMatrix<Functor_, Rows_, Co
6565
Functor_ f_;
6666
};
6767
// definition of procedrual matrices
68-
template <int Rows, int Cols> using ZeroMatrix = ProceduralMatrix<decltype([](int, int) { return 0; }), Rows, Cols>;
69-
template <int Rows, int Cols> using OnesMatrix = ProceduralMatrix<decltype([](int, int) { return 1; }), Rows, Cols>;
70-
template <int Rows, int Cols>
71-
using IdentityMatrix = ProceduralMatrix<decltype([](int i, int j) { return i == j ? 1 : 0; }), Rows, Cols>;
68+
template <typename Scalar, int Rows, int Cols>
69+
using ZeroMatrix = ProceduralMatrix<decltype([](int, int) { return Scalar(0); }), Rows, Cols>;
70+
template <typename Scalar, int Rows, int Cols>
71+
using OnesMatrix = ProceduralMatrix<decltype([](int, int) { return Scalar(1); }), Rows, Cols>;
72+
template <typename Scalar, int Rows, int Cols>
73+
using IdentityMatrix =
74+
ProceduralMatrix<decltype([](int i, int j) { return i == j ? Scalar(1) : Scalar(0); }), Rows, Cols>;
7275

7376
namespace internals {
7477

@@ -341,18 +344,18 @@ class Matrix : public MatrixBase<Scalar_, Rows_, Cols_, StorageOrder_, Matrix<Sc
341344
}
342345

343346
// static named constructors
344-
static constexpr auto Zero() { return ZeroMatrix<Rows_, Cols_>(); }
347+
static constexpr auto Zero() { return ZeroMatrix<Scalar_, Rows_, Cols_>(); }
345348
static constexpr auto Zero(int size) {
346349
fdapde_static_assert(Rows_ == 1 || Cols_ == 1, THIS_METHOD_IS_FOR_ROW_OR_COLUMN_VECTORS_ONLY);
347-
return ZeroMatrix< Rows_ == 1 ? Rows_ : Dynamic, Cols_ == 1 ? Cols_ : Dynamic >(size);
350+
return ZeroMatrix<Scalar_, Rows_ == 1 ? Rows_ : Dynamic, Cols_ == 1 ? Cols_ : Dynamic>(size);
348351
}
349-
static constexpr auto Zero(int rows, int cols) { return ZeroMatrix<Dynamic, Dynamic>(rows, cols); }
350-
static constexpr auto Ones() { return OnesMatrix<Rows_, Cols_>(); }
352+
static constexpr auto Zero(int rows, int cols) { return ZeroMatrix<Scalar_, Dynamic, Dynamic>(rows, cols); }
353+
static constexpr auto Ones() { return OnesMatrix<Scalar_, Rows_, Cols_>(); }
351354
static constexpr auto Ones(int size) {
352355
fdapde_static_assert(Rows_ == 1 || Cols_ == 1, THIS_METHOD_IS_FOR_ROW_OR_COLUMN_VECTORS_ONLY);
353-
return OnesMatrix < Rows_ == 1 ? Rows_ : Dynamic, Cols_ == 1 ? Cols_ : Dynamic > (size);
356+
return OnesMatrix<Scalar_, Rows_ == 1 ? Rows_ : Dynamic, Cols_ == 1 ? Cols_ : Dynamic>(size);
354357
}
355-
static constexpr auto Ones(int rows, int cols) { return OnesMatrix<Dynamic, Dynamic>(rows, cols); }
358+
static constexpr auto Ones(int rows, int cols) { return OnesMatrix<Scalar_, Dynamic, Dynamic>(rows, cols); }
356359
static constexpr auto Constant(Scalar value) { return value * Ones(); }
357360
static constexpr auto Constant(int size, Scalar value) {
358361
fdapde_static_assert(Rows_ == 1 || Cols_ == 1, THIS_METHOD_IS_FOR_ROW_OR_COLUMN_VECTORS_ONLY);
@@ -445,7 +448,7 @@ class MatrixView :
445448
// vector aliases
446449
template <typename Scalar, int Rows> using Vector = Matrix<Scalar, Rows, 1>;
447450
template <typename Scalar, int Rows> using VectorView = MatrixView<Scalar, Rows, 1>;
448-
451+
449452
} // namespace fdapde
450453

451454
#endif // _FDAPDE_LINALG_MATRIX_H__

fdaPDE/src/linear_algebra/orthogonal.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ struct OrthogonalMatrix :
163163
constexpr OrthogonalMatrix(const std::vector<Scalar__>& data, internals::checked_t) :
164164
Base(fdapde::sqrt(data.size()), fdapde::sqrt(data.size())), m_(data) {
165165
const int n = m_.rows();
166-
auto I = IdentityMatrix<Dynamic, Dynamic>(n, n);
166+
auto I = IdentityMatrix<Scalar_, Dynamic, Dynamic>(n, n);
167167
fdapde_assert(almost_equal(m_ * m_.transpose() FDAPDE_COMMA I FDAPDE_COMMA 1e-14));
168168
}
169169
template <typename Scalar__, std::size_t Size>
@@ -173,7 +173,7 @@ struct OrthogonalMatrix :
173173
fdapde_static_assert(
174174
Rows_ != Dynamic && Cols_ != Dynamic && Rows_ * Cols_ == Size, THIS_METHOD_IS_FOR_STATIC_SIZED_MATRICES_ONLY);
175175
const int n = m_.rows();
176-
auto I = IdentityMatrix<Dynamic, Dynamic>(n, n);
176+
auto I = IdentityMatrix<Scalar_, Dynamic, Dynamic>(n, n);
177177
fdapde_assert(almost_equal(m_ * m_.transpose() FDAPDE_COMMA I FDAPDE_COMMA 1e-14));
178178
}
179179
// assume input already orthogonal, trusts the caller
@@ -260,15 +260,15 @@ class OrthogonalMatrixView : public OrthogonalMatrixExpr<OrthogonalMatrixView<Sc
260260
constexpr OrthogonalMatrixView(Scalar__* data, internals::checked_t) : Base(), data_(data) {
261261
fdapde_static_assert(Rows_ != Dynamic && Cols_ != Dynamic, THIS_METHOD_IS_FOR_STATIC_SIZED_VIEWS_ONLY);
262262
const int size = data_.rows();
263-
auto I = IdentityMatrix<Dynamic, Dynamic>(size, size);
263+
auto I = IdentityMatrix<Scalar_, Dynamic, Dynamic>(size, size);
264264
fdapde_assert(almost_equal(data_ * data_.transpose() FDAPDE_COMMA I FDAPDE_COMMA 1e-14));
265265
}
266266
template <typename Scalar__>
267267
requires(std::is_constructible_v<Scalar_, Scalar__>)
268268
constexpr OrthogonalMatrixView(Scalar__* data, int rows, int cols, internals::checked_t) :
269269
Base(rows, cols), data_(data) {
270270
fdapde_assert(rows > 0 && cols > 0 && rows == cols);
271-
auto I = IdentityMatrix<Dynamic, Dynamic>(rows, cols);
271+
auto I = IdentityMatrix<Scalar_, Dynamic, Dynamic>(rows, cols);
272272
fdapde_assert(almost_equal(data_ * data_.transpose() FDAPDE_COMMA I FDAPDE_COMMA 1e-14));
273273
}
274274
// assume input already orthogonal, trusts the caller

0 commit comments

Comments
 (0)