7 return std::visit([
this](
const auto& vec) -> Eigen::VectorXd {
8 using T =
typename std::decay_t<
decltype(vec)>::value_type;
10 if constexpr (std::is_arithmetic_v<T>) {
12 }
else if constexpr (std::is_same_v<T, std::complex<float>> || std::is_same_v<T, std::complex<double>>) {
13 Eigen::VectorXd result(vec.size());
14 for (Eigen::Index i = 0; i < vec.size(); ++i) {
15 result(i) =
static_cast<double>(std::abs(vec[i]));
18 }
else if constexpr (GlmType<T>) {
19 error<std::invalid_argument>(
22 std::source_location::current(),
23 "Cannot convert structured GLM type {} to vector. Use to_matrix() instead.",
26 error<std::invalid_argument>(
29 std::source_location::current(),
30 "Unsupported type for Eigen conversion: {}",
39 return std::visit([
this](
const auto& vec) -> Eigen::MatrixXd {
40 using T =
typename std::decay_t<
decltype(vec)>::value_type;
42 if constexpr (std::is_arithmetic_v<T>) {
44 }
else if constexpr (std::is_same_v<T, std::complex<float>> || std::is_same_v<T, std::complex<double>>) {
46 }
else if constexpr (GlmType<T>) {
49 error<std::invalid_argument>(
52 std::source_location::current(),
53 "Unsupported type for Eigen conversion: {}",
63 error<std::invalid_argument>(
66 std::source_location::current(),
67 "to_magnitude_vector() requires complex data, but variant contains {}",
71 return std::visit([](
const auto& vec) -> Eigen::VectorXd {
72 using T =
typename std::decay_t<
decltype(vec)>::value_type;
74 if constexpr (std::is_same_v<T, std::complex<float>> || std::is_same_v<T, std::complex<double>>) {
75 Eigen::VectorXd result(vec.size());
76 for (Eigen::Index i = 0; i < vec.size(); ++i) {
77 result(i) = std::abs(vec[i]);
81 return Eigen::VectorXd(0);
90 error<std::invalid_argument>(
93 std::source_location::current(),
94 "to_complex_vector() requires complex data, but variant contains {}",
98 return std::visit([](
const auto& vec) -> Eigen::VectorXcd {
99 using T =
typename std::decay_t<
decltype(vec)>::value_type;
101 if constexpr (std::is_same_v<T, std::complex<float>>) {
102 Eigen::VectorXcd result(vec.size());
103 for (Eigen::Index i = 0; i < vec.size(); ++i) {
104 result(i) = std::complex<double>(
105 static_cast<double>(vec[i].real()),
106 static_cast<double>(vec[i].imag()));
109 }
else if constexpr (std::is_same_v<T, std::complex<double>>) {
110 Eigen::VectorXcd result(vec.size());
111 for (Eigen::Index i = 0; i < vec.size(); ++i) {
116 return Eigen::VectorXcd(0);
125 error<std::invalid_argument>(
128 std::source_location::current(),
129 "to_phase_vector() requires complex data, but variant contains {}",
133 return std::visit([](
const auto& vec) -> Eigen::VectorXd {
134 using T =
typename std::decay_t<
decltype(vec)>::value_type;
136 if constexpr (std::is_same_v<T, std::complex<float>> || std::is_same_v<T, std::complex<double>>) {
137 Eigen::VectorXd result(vec.size());
138 for (Eigen::Index i = 0; i < vec.size(); ++i) {
139 result(i) = std::arg(vec[i]);
143 return Eigen::VectorXd(0);
151 return std::visit([](
const auto& vec) {
return vec.size(); },
m_variant);
156 return std::visit([](
const auto& vec) ->
size_t {
157 using T =
typename std::decay_t<
decltype(vec)>::value_type;
159 if constexpr (std::is_arithmetic_v<T>) {
161 }
else if constexpr (std::is_same_v<T, std::complex<float>> || std::is_same_v<T, std::complex<double>>) {
163 }
else if constexpr (GlmVec2Type<T>) {
165 }
else if constexpr (GlmVec3Type<T>) {
167 }
else if constexpr (GlmVec4Type<T>) {
169 }
else if constexpr (GlmMatrixType<T>) {
185 return std::visit([](
const auto& vec) ->
bool {
186 return vec.size() <= std::numeric_limits<Eigen::Index>::max();
193 return std::visit([](
const auto& vec) ->
bool {
194 using T =
typename std::decay_t<
decltype(vec)>::value_type;
195 return std::is_same_v<T, std::complex<float>> || std::is_same_v<T, std::complex<double>>;
202 return std::visit([](
const auto& vec) ->
bool {
203 using T =
typename std::decay_t<
decltype(vec)>::value_type;
211 return std::visit([](
const auto& vec) -> std::string {
212 using T =
typename std::decay_t<
decltype(vec)>::value_type;
213 return typeid(T).name();
Eigen::VectorXd to_vector() const
Convert DataVariant to Eigen column vector.
bool is_complex() const
Check if data contains complex numbers.
bool validate_dimensions() const
Validate that data dimensions fit within Eigen limits.
Eigen::VectorXcd to_complex_vector() const
Convert complex data to Eigen complex vector.
size_t element_count() const noexcept
Get number of elements (columns in matrix representation)
std::string type_name() const
Get underlying data type name.
Eigen::MatrixXd to_matrix() const
Convert DataVariant to Eigen matrix.
std::pair< size_t, size_t > matrix_dimensions() const
Get matrix dimensions as (rows, cols)
Eigen::MatrixXd scalar_to_matrix(const std::vector< T > &vec) const
Eigen::VectorXd to_magnitude_vector() const
Convert complex data to magnitude vector.
Eigen::VectorXd scalar_to_vector(const std::vector< T > &vec) const
bool is_structured() const
Check if data contains GLM types.
Eigen::MatrixXd glm_to_matrix(const std::vector< T > &vec) const
Eigen::VectorXd to_phase_vector() const
Convert complex data to phase vector (angle in radians)
size_t component_count() const
Get number of components per element (rows in matrix representation)
const Kakshya::DataVariant & m_variant
Eigen::MatrixXd complex_to_matrix(const std::vector< std::complex< T > > &vec) const
@ Runtime
General runtime operations (default fallback)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.