Open S-Dafarra opened 4 years ago
I just spotted this from https://en.cppreference.com/w/cpp/numeric/complex:
In order to satisfy the requirements of array-oriented access, an implementation is constrained to store the real and imaginary components of a std::complex specialization in separate and adjacent memory locations. Possible declarations for its non-static data members include:
- an array of type value_type[2], with the first element holding the real component and the second element holding the imaginary component (e.g. Microsoft Visual Studio)
Hence, I wonder if is possible to convert a mat_complex_split_t
to a std::complex<T*>
. In this case, the pointer
type of Vector
would be std::complex<T*>*
. Nevertheless, I would still need some ad-hoc element accessors for retrieving a specific element or reference, and an ad-hoc iterator, but the code of Vector
, Element
and MultiDimensionalArray
might remain the same.
It would be nice to maintain interoperability with Eigen. Eigen uses
std::complex
as a type for complex arrays (https://eigen.tuxfamily.org/dox/classEigen_1_1ComplexEigenSolver.html#a3604c99a69fac3bee42c88cb2b589143), whilematio
has its own type: https://github.com/tbeu/matio/blob/master/src/matio.h#L164-L167. Moreover, the data in thematvar_t
is not stored as an array of a pair of numbers, but rather the real and imaginary parts are two separate vectors. Hence, I think we cannot havematioCpp::Vector<std::complex<double>>
since we cannot cast the internal data tostd::complex<double>*
as it would be required bydata()
.An alternative might be to specialize all the code relative to
Element
,Vector
,VectorIterator
andMultiDimensionalArray
just for complex types, but this would require reimplementing (and testing) basically half of the codebase.Still investigating possible alternatives.