diff --git a/src/MatlabReader.cpp b/src/MatlabReader.cpp index 14226b1..7e677f0 100644 --- a/src/MatlabReader.cpp +++ b/src/MatlabReader.cpp @@ -1,6 +1,6 @@ #include "MatlabReader.h" +#include "Function.h" -#include double* calculateArray(matvar_t* aMatVar, const char* aFieldName) { @@ -13,88 +13,63 @@ double* calculateArray(matvar_t* aMatVar, const char* aFieldName) return result; } -MatlabReader::MatlabReader() +MatlabReader::MatlabReader(const std::string& aFilePath) { - + mMatFile = Mat_Open(aFilePath.c_str(), MAT_ACC_RDONLY); } -bool MatlabReader::read(Input* aInput,MatchedFilter* aOutput,const std::string& aFilePath) +MatlabReader::~MatlabReader() { - mat_t* mat = Mat_Open(aFilePath.c_str(), MAT_ACC_RDONLY); - if(mat == nullptr) + Mat_Close(mMatFile); +} + +Aurora::Matrix MatlabReader::read(const std::string& aFieldName) +{ + if(mMatFile == nullptr) { - return false; + return Aurora::Matrix(); } - matvar_t* matvar = Mat_VarRead(mat,"input"); + matvar_t* matvar = Mat_VarRead(mMatFile, aFieldName.c_str()); if (matvar == nullptr) { - return false; + return Aurora::Matrix(); } + bool isComplex = matvar->isComplex; + int rank = matvar->rank; + int rows = 1, columns = 1, slices = 1; + if (rank >= 3) + { + slices = matvar->dims[2]; + } + if (rank >= 2) + { + columns = matvar->dims[1]; + } + if (rank >= 1) + { + rows = matvar->dims[0]; + } + Aurora::Matrix result; + if(!isComplex) + { + result = Aurora::Matrix::copyFromRawData(reinterpret_cast(matvar->data),rows,columns,slices); + } + else + { + mat_complex_split_t* complexDouble = reinterpret_cast(matvar->data); + unsigned long long dataLength = matvar->nbytes / static_cast(matvar->data_size); + double* data = Aurora::malloc(dataLength, true); + double* re = reinterpret_cast(complexDouble->Re); + double* im = reinterpret_cast(complexDouble->Im); + for ( unsigned long long i = 0; i < dataLength; i++) + { + data[2*i] = re[i]; + data[2*i+1] = im[i]; + } + result = Aurora::Matrix::fromRawData(data,rows,columns,slices,Aurora::Complex); - aInput->mCe = calculateArray(matvar,"ce"); - - matvar_t* measuredCEusedVar = Mat_VarGetStructFieldByName(matvar,"measuredCEused",0); - double* measuredCEused = reinterpret_cast(measuredCEusedVar->data); - aInput->mMeasuredCEused = *measuredCEused; - Mat_VarFree(measuredCEusedVar); - - matvar_t* removeOutliersFromCEMeasuredVar = Mat_VarGetStructFieldByName(matvar,"removeOutliersFromCEMeasured",0); - double* removeOutliersFromCEMeasured = reinterpret_cast(removeOutliersFromCEMeasuredVar->data); - aInput->mRemoveOutliersFromCEMeasured = *removeOutliersFromCEMeasured; - Mat_VarFree(removeOutliersFromCEMeasuredVar); - - matvar_t* hardwareVersionVar = Mat_VarGetStructFieldByName(matvar,"hardwareVersion",0); - char* hardwareVersion = reinterpret_cast(hardwareVersionVar->data); - aInput->mHardwareVersion = hardwareVersion; - Mat_VarFree(hardwareVersionVar); - - matvar_t* paramsVar = Mat_VarGetStructFieldByName(matvar,"params",0); - - aInput->mParams->mSenderTasList = calculateArray(paramsVar,"senderTasList"); - - aInput->mParams->mSenderElementList = calculateArray(paramsVar,"senderElementList"); - - aInput->mParams->mReceiverTasList = calculateArray(paramsVar,"receiverTasList");; - - aInput->mParams->mSenderElementList = calculateArray(paramsVar,"receiverElementList"); - - aInput->mParams->mMotorPos = calculateArray(paramsVar,"motorPos"); - - matvar_t* constrictReflectionAnglesVar = Mat_VarGetStructFieldByName(paramsVar,"constrictReflectionAngles",0); - aInput->mParams->mConstrictReflectionAngles = *reinterpret_cast(constrictReflectionAnglesVar->data); - Mat_VarFree(constrictReflectionAnglesVar); - - matvar_t* angleLowerLimitVar = Mat_VarGetStructFieldByName(paramsVar,"angleLowerLimit",0); - aInput->mParams->mAngleLowerLimit = *reinterpret_cast(angleLowerLimitVar->data); - Mat_VarFree(angleLowerLimitVar); - - matvar_t* angleUpperLimitVar = Mat_VarGetStructFieldByName(paramsVar,"angleUpperLimit",0); - aInput->mParams->mAngleUpperLimit = *reinterpret_cast(angleUpperLimitVar->data); - Mat_VarFree(angleUpperLimitVar); - - matvar_t* findDefectsVar = Mat_VarGetStructFieldByName(paramsVar,"findDefects",0); - aInput->mParams->mFindDefects = *reinterpret_cast(findDefectsVar->data); - Mat_VarFree(findDefectsVar); - - matvar_t* epsilonVar = Mat_VarGetStructFieldByName(paramsVar,"epsilon",0); - aInput->mParams->mEpsilon = *reinterpret_cast(epsilonVar->data); - Mat_VarFree(epsilonVar); - - matvar = Mat_VarRead(mat,"output"); - mat_complex_split_t* complexDouble = reinterpret_cast(matvar->data); - unsigned long long dataLength = matvar->nbytes / static_cast(matvar->data_size);; - double* real = reinterpret_cast(complexDouble->Re); - double* imag = reinterpret_cast(complexDouble->Im); - double* realData = new double[dataLength]; - double* imagData = new double[dataLength]; - std::copy(real,real+dataLength,realData); - std::copy(imag,imag+dataLength,imagData); - aOutput->mImag = imagData; - aOutput->mReal = realData; - + } Mat_VarFree(matvar); - Mat_Close(mat); - - return true; + return result; } diff --git a/src/MatlabReader.h b/src/MatlabReader.h index de53170..3f1d7b2 100644 --- a/src/MatlabReader.h +++ b/src/MatlabReader.h @@ -2,75 +2,21 @@ #define MATLABREADER_H #include +#include "Matrix.h" + #include -class Params -{ -public: - Params(){} - - double* mSenderTasList; - double* mSenderElementList; - double* mReceiverTasList; - double* mReceiverElementList; - double* mMotorPos; - double mConstrictReflectionAngles; - double mAngleLowerLimit; - double mAngleUpperLimit; - double mFindDefects; - double mEpsilon; -}; - -class Input -{ -public: - Input():mParams(new Params()){} - ~Input(){delete mParams;} - Params* mParams; - double* mCe; - double mMeasuredCEused; - double mRemoveOutliersFromCEMeasured; - std::string mHardwareVersion; -}; - -class MatchedFilter -{ -public: - MatchedFilter(){}; - - double* mReal; - double* mImag; -}; - - class MatlabReader { public: - MatlabReader(); - bool read(Input* aInput,MatchedFilter* aOutput,const std::string& aFilePath); + + explicit MatlabReader(const std::string& aFilePath); + ~MatlabReader(); + Aurora::Matrix read(const std::string& aFieldName); + +private: + mat_t* mMatFile; }; -class MatlabCreator -{ -public: - MatlabCreator(){}; - void createMat(const std::string& aFileName,size_t* aSize,int aRank,double* aRealData,double* aImageData) - { - mat_t* matfp = nullptr; - matfp = Mat_CreateVer(aFileName.c_str(),nullptr,MAT_FT_DEFAULT); - if ( nullptr == matfp ) - { - return; - } - mat_complex_split_t complexDouble; - complexDouble.Im = aImageData; - complexDouble.Re = aRealData; - matvar_t* measurementIdVar = Mat_VarCreate("output", MAT_C_DOUBLE,MAT_T_DOUBLE,aRank,aSize,&complexDouble,MAT_F_COMPLEX); - Mat_VarWrite(matfp,measurementIdVar,MAT_COMPRESSION_NONE); - Mat_VarFree(measurementIdVar); - Mat_Close(matfp); - return; - } -}; #endif // MATLABREADER_H