MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ insert_matrix()

void MayaFlux::Kakshya::EigenInsertion::insert_matrix ( const Eigen::MatrixXd &  matrix,
MatrixInterpretation  interpretation = MatrixInterpretation::AUTO,
bool  preserve_precision = true 
)

Insert Eigen matrix with automatic interpretation.

Parameters
matrixSource matrix (columns are data points)
interpretationHow to interpret matrix structure
preserve_precisionIf true, use double for scalars

AUTO interpretation rules:

  • 1 row → scalar (double or float based on preserve_precision)
  • 2 rows → complex<double> or glm::vec2 (use interpretation to specify)
  • 3 rows → glm::vec3
  • 4 rows → glm::vec4
  • 16 rows → glm::mat4
  • Other → error (must specify interpretation)

Definition at line 67 of file EigenInsertion.cpp.

71{
72 if (interpretation == MatrixInterpretation::AUTO) {
73 switch (matrix.rows()) {
74 case 1:
75 interpretation = MatrixInterpretation::SCALAR;
76 break;
77 case 2:
78 error<std::invalid_argument>(
81 std::source_location::current(),
82 "Ambiguous 2-row matrix. Specify {} or {}",
85 break;
86 case 3:
87 interpretation = MatrixInterpretation::VEC3;
88 break;
89 case 4:
90 interpretation = MatrixInterpretation::VEC4;
91 break;
92 case 16:
93 interpretation = MatrixInterpretation::MAT4;
94 break;
95 default:
96 error<std::invalid_argument>(
99 std::source_location::current(),
100 "Cannot auto-interpret {}-row matrix. Specify MatrixInterpretation explicitly.",
101 matrix.rows());
102 }
103 }
104
105 validate_matrix_dimensions(matrix, interpretation);
106
107 switch (interpretation) {
109 if (preserve_precision) {
110 std::vector<double> data(matrix.cols());
111 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
112 data[i] = matrix(0, i);
113 }
114 m_variant = Kakshya::DataVariant { std::move(data) };
115 } else {
116 std::vector<float> data(matrix.cols());
117 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
118 data[i] = static_cast<float>(matrix(0, i));
119 }
120 m_variant = Kakshya::DataVariant { std::move(data) };
121 }
122 break;
123
125 if (preserve_precision) {
126 std::vector<std::complex<double>> data(matrix.cols());
127 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
128 data[i] = std::complex<double>(matrix(0, i), matrix(1, i));
129 }
130 m_variant = Kakshya::DataVariant { std::move(data) };
131 } else {
132 std::vector<std::complex<float>> data(matrix.cols());
133 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
134 data[i] = std::complex<float>(
135 static_cast<float>(matrix(0, i)),
136 static_cast<float>(matrix(1, i)));
137 }
138 m_variant = Kakshya::DataVariant { std::move(data) };
139 }
140 break;
141
143 std::vector<glm::vec2> data(matrix.cols());
144 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
145 data[i] = glm::vec2(
146 static_cast<float>(matrix(0, i)),
147 static_cast<float>(matrix(1, i)));
148 }
149 m_variant = Kakshya::DataVariant { std::move(data) };
150 break;
151 }
152
154 std::vector<glm::vec3> data(matrix.cols());
155 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
156 data[i] = glm::vec3(
157 static_cast<float>(matrix(0, i)),
158 static_cast<float>(matrix(1, i)),
159 static_cast<float>(matrix(2, i)));
160 }
161 m_variant = Kakshya::DataVariant { std::move(data) };
162 break;
163 }
164
166 std::vector<glm::vec4> data(matrix.cols());
167 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
168 data[i] = glm::vec4(
169 static_cast<float>(matrix(0, i)),
170 static_cast<float>(matrix(1, i)),
171 static_cast<float>(matrix(2, i)),
172 static_cast<float>(matrix(3, i)));
173 }
174 m_variant = Kakshya::DataVariant { std::move(data) };
175 break;
176 }
177
179 std::vector<glm::mat4> data(matrix.cols());
180 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
181 float mat_data[16];
182 for (int j = 0; j < 16; ++j) {
183 mat_data[j] = static_cast<float>(matrix(j, i));
184 }
185 data[i] = glm::make_mat4(mat_data);
186 }
187 m_variant = Kakshya::DataVariant { std::move(data) };
188 break;
189 }
190
191 default:
192 error<std::invalid_argument>(
195 std::source_location::current(),
196 "Invalid MatrixInterpretation: {}",
197 Reflect::enum_to_string(interpretation));
198 }
199}
void validate_matrix_dimensions(const Eigen::MatrixXd &matrix, MatrixInterpretation interpretation) const
@ Runtime
General runtime operations (default fallback)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
Definition NDData.hpp:73
@ MAT4
16 rows → glm::mat4 (flattened)
@ SCALAR
Single row → scalar values.
@ COMPLEX
2 rows → complex (row 0 = real, row 1 = imag)
constexpr std::string_view enum_to_string(EnumType value) noexcept
Universal enum to string converter using magic_enum (original case)

References MayaFlux::Kakshya::AUTO, MayaFlux::Kakshya::COMPLEX, MayaFlux::Reflect::enum_to_string(), MayaFlux::Journal::Kakshya, m_variant, MayaFlux::Kakshya::MAT4, MayaFlux::Journal::Runtime, MayaFlux::Kakshya::SCALAR, validate_matrix_dimensions(), MayaFlux::Kakshya::VEC2, MayaFlux::Kakshya::VEC3, and MayaFlux::Kakshya::VEC4.

Referenced by MayaFlux::Kakshya::from_eigen_matrix().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: