ami-iit / matio-cpp

A C++ wrapper of the matio library, with memory ownership handling, to read and write .mat files.
https://ami-iit.github.io/matio-cpp/
BSD 2-Clause "Simplified" License
58 stars 9 forks source link

Implement classes for dealing with complex vectors and complex multidimensional arrays #5

Open S-Dafarra opened 4 years ago

S-Dafarra commented 3 years ago

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), while matio has its own type: https://github.com/tbeu/matio/blob/master/src/matio.h#L164-L167. Moreover, the data in the matvar_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 have matioCpp::Vector<std::complex<double>> since we cannot cast the internal data to std::complex<double>* as it would be required by data().

An alternative might be to specialize all the code relative to Element, Vector, VectorIterator and MultiDimensionalArray just for complex types, but this would require reimplementing (and testing) basically half of the codebase.

Still investigating possible alternatives.

S-Dafarra commented 3 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.