Update MatlabReader

This commit is contained in:
kradchen
2023-05-06 14:13:36 +08:00
parent f3339e58eb
commit 849d0bb961
2 changed files with 57 additions and 136 deletions

View File

@@ -1,6 +1,6 @@
#include "MatlabReader.h"
#include "Function.h"
#include <matio.h>
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<double*>(matvar->data),rows,columns,slices);
}
else
{
mat_complex_split_t* complexDouble = reinterpret_cast<mat_complex_split_t*>(matvar->data);
unsigned long long dataLength = matvar->nbytes / static_cast<unsigned long long>(matvar->data_size);
double* data = Aurora::malloc(dataLength, true);
double* re = reinterpret_cast<double*>(complexDouble->Re);
double* im = reinterpret_cast<double*>(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<double*>(measuredCEusedVar->data);
aInput->mMeasuredCEused = *measuredCEused;
Mat_VarFree(measuredCEusedVar);
matvar_t* removeOutliersFromCEMeasuredVar = Mat_VarGetStructFieldByName(matvar,"removeOutliersFromCEMeasured",0);
double* removeOutliersFromCEMeasured = reinterpret_cast<double*>(removeOutliersFromCEMeasuredVar->data);
aInput->mRemoveOutliersFromCEMeasured = *removeOutliersFromCEMeasured;
Mat_VarFree(removeOutliersFromCEMeasuredVar);
matvar_t* hardwareVersionVar = Mat_VarGetStructFieldByName(matvar,"hardwareVersion",0);
char* hardwareVersion = reinterpret_cast<char*>(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<double*>(constrictReflectionAnglesVar->data);
Mat_VarFree(constrictReflectionAnglesVar);
matvar_t* angleLowerLimitVar = Mat_VarGetStructFieldByName(paramsVar,"angleLowerLimit",0);
aInput->mParams->mAngleLowerLimit = *reinterpret_cast<double*>(angleLowerLimitVar->data);
Mat_VarFree(angleLowerLimitVar);
matvar_t* angleUpperLimitVar = Mat_VarGetStructFieldByName(paramsVar,"angleUpperLimit",0);
aInput->mParams->mAngleUpperLimit = *reinterpret_cast<double*>(angleUpperLimitVar->data);
Mat_VarFree(angleUpperLimitVar);
matvar_t* findDefectsVar = Mat_VarGetStructFieldByName(paramsVar,"findDefects",0);
aInput->mParams->mFindDefects = *reinterpret_cast<double*>(findDefectsVar->data);
Mat_VarFree(findDefectsVar);
matvar_t* epsilonVar = Mat_VarGetStructFieldByName(paramsVar,"epsilon",0);
aInput->mParams->mEpsilon = *reinterpret_cast<double*>(epsilonVar->data);
Mat_VarFree(epsilonVar);
matvar = Mat_VarRead(mat,"output");
mat_complex_split_t* complexDouble = reinterpret_cast<mat_complex_split_t*>(matvar->data);
unsigned long long dataLength = matvar->nbytes / static_cast<unsigned long long>(matvar->data_size);;
double* real = reinterpret_cast<double*>(complexDouble->Re);
double* imag = reinterpret_cast<double*>(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;
}

View File

@@ -2,75 +2,21 @@
#define MATLABREADER_H
#include <string>
#include "Matrix.h"
#include <matio.h>
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