59 SARA const sara{std::make_tuple(std::string{
"DB3"}, 1u), std::make_tuple(std::string{
"DB1"}, 2u),
60 std::make_tuple(std::string{
"DB1"}, 3u)};
63 auto const Psi = linear_transform<t_real>(sara,
rows,
cols);
64 SECTION(
"Indirect transform") {
66 Image<> const expected = sara.direct(image);
68 auto const as_vector =
Vector<>::Map(image.data(), image.size());
70 Vector<> const actual = Psi.adjoint() * as_vector;
71 CHECK(actual.size() == expected.size());
72 auto const coeffs =
Image<>::Map(actual.data(), image.rows(), image.cols() * sara.size());
73 CHECK(expected.rows() == coeffs.rows());
74 CHECK(expected.cols() == coeffs.cols());
75 CHECK(coeffs.isApprox(expected, 1e-8));
77 SECTION(
"direct transform") {
79 Image<> const expected = sara.indirect(coeffs);
81 auto const as_vector =
Vector<>::Map(coeffs.data(), coeffs.size());
83 Vector<> const actual = Psi * as_vector;
84 CHECK(actual.size() == expected.size());
85 CHECK(coeffs.cols() % sara.size() == 0);
86 auto const image =
Image<>::Map(actual.data(), coeffs.rows(), coeffs.cols() / sara.size());
87 CHECK(expected.rows() == image.rows());
88 CHECK(expected.cols() == image.cols());
89 CHECK(image.isApprox(expected, 1e-8));
93 auto constexpr
rows = 256,
cols = 256;
94 auto const Psi = linear_transform<t_real>(sara,
rows,
cols);
95 SECTION(
"Indirect transform") {
97 Image<> const expected = sara.direct(image);
99 auto const as_vector =
Vector<>::Map(image.data(), image.size());
101 Vector<> const actual = Psi.adjoint() * as_vector;
102 CHECK(actual.size() == expected.size());
103 auto const coeffs =
Image<>::Map(actual.data(), image.rows(), image.cols() * sara.size());
104 CHECK(expected.rows() == coeffs.rows());
105 CHECK(expected.cols() == coeffs.cols());
106 CHECK(coeffs.isApprox(expected, 1e-8));
108 SECTION(
"direct transform") {
110 Image<> const expected = sara.indirect(coeffs);
112 auto const as_vector =
Vector<>::Map(coeffs.data(), coeffs.size());
114 Vector<> const actual = Psi * as_vector;
115 CHECK(actual.size() == expected.size());
116 CHECK(coeffs.cols() % sara.size() == 0);
117 auto const image =
Image<>::Map(actual.data(), coeffs.rows(), coeffs.cols() / sara.size());
118 CHECK(expected.rows() == image.rows());
119 CHECK(expected.cols() == image.cols());
120 CHECK(image.isApprox(expected, 1e-8));
Eigen::Matrix< T, Eigen::Dynamic, 1 > Vector
A vector of a given type.