Add MatlabReader read4d function.

This commit is contained in:
sunwen
2023-05-12 16:29:49 +08:00
parent 55417a0efa
commit 40136b7ee9
2 changed files with 66 additions and 1 deletions

View File

@@ -67,7 +67,32 @@ Aurora::Matrix MatlabReader::read(const std::string& aFieldName)
Aurora::Matrix result; Aurora::Matrix result;
if(!isComplex) if(!isComplex)
{ {
result = Aurora::Matrix::copyFromRawData(reinterpret_cast<double*>(matvar->data),rows,columns,slices); size_t matrixSize = matvar->nbytes / static_cast<unsigned long long>(matvar->data_size);
double* matrixData = new double[matrixSize];
switch(matvar->data_type )
{
case MAT_T_INT16:
{
std::copy((short*)matvar->data, (short*)matvar->data + matrixSize, matrixData);
break;
}
case MAT_T_UINT16:
{
std::copy((unsigned short*)matvar->data, (unsigned short*)matvar->data + matrixSize, matrixData);
break;
}
case MAT_T_INT32:
{
std::copy((int*)matvar->data, (int*)matvar->data + matrixSize, matrixData);
break;
}
case MAT_T_DOUBLE:
{
std::copy((double*)matvar->data, (double*)matvar->data + matrixSize, matrixData);
break;
}
}
result = Aurora::Matrix::fromRawData(matrixData,rows,columns,slices);
} }
else else
{ {
@@ -87,3 +112,42 @@ Aurora::Matrix MatlabReader::read(const std::string& aFieldName)
Mat_VarFree(matvar); Mat_VarFree(matvar);
return result; return result;
} }
std::vector<Aurora::Matrix> MatlabReader::read4d(const std::string& aFieldName)
{
if(mMatFile == nullptr)
{
return std::vector<Aurora::Matrix>();
}
matvar_t* matvar = Mat_VarRead(mMatFile, aFieldName.c_str());
if (matvar == nullptr)
{
return std::vector<Aurora::Matrix>();
}
int rank = matvar->rank;
if (rank != 4)
{
return std::vector<Aurora::Matrix>();
}
bool isComplex = matvar->isComplex;
int rows = matvar->dims[0];
int columns = matvar->dims[1];
int slices = matvar->dims[2];
int dims4 = matvar->dims[3];
std::vector<Aurora::Matrix> result;
if(!isComplex)
{
double* matrix3d = reinterpret_cast<double*>(matvar->data);
for(int i=0; i<dims4; ++i)
{
result.push_back(Aurora::Matrix::copyFromRawData(matrix3d,rows,columns,slices));
matrix3d+=rows*columns*slices;
}
}
else
{
return std::vector<Aurora::Matrix>();
}
return result;
}

View File

@@ -12,6 +12,7 @@ public:
explicit MatlabReader(const std::string& aFilePath); explicit MatlabReader(const std::string& aFilePath);
~MatlabReader(); ~MatlabReader();
std::vector<Aurora::Matrix> read4d(const std::string& aFieldName);
Aurora::Matrix read(const std::string& aFieldName); Aurora::Matrix read(const std::string& aFieldName);
std::shared_ptr<short> readint16(const std::string& aFieldName,size_t& size); std::shared_ptr<short> readint16(const std::string& aFieldName,size_t& size);