Update MatlabReader
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user