2023-09-19 11:17:43 +08:00
|
|
|
|
/*********************************************************************************************
|
|
|
|
|
|
Description: <EFBFBD>ṩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>matlab<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ݹ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
Copyright : All right reserved by ZheYuan.BJ
|
|
|
|
|
|
|
|
|
|
|
|
Author : Zhang Zhonghai
|
|
|
|
|
|
Date : 2023/09/18
|
|
|
|
|
|
***********************************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
#include <mat.h>
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
#include "matlab_io.h"
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
2023-10-05 10:38:21 +08:00
|
|
|
|
// <20><>matlab<61>洢<EFBFBD><E6B4A2>ʽת<CABD><D7AA><EFBFBD><EFBFBD>c<EFBFBD>洢<EFBFBD><E6B4A2>ʽ
|
|
|
|
|
|
#define TRANS_ROW_COL(dst, src, rowNum, colNum) \
|
|
|
|
|
|
for (int rowI = 0; rowI < rowNum; ++rowI) { \
|
|
|
|
|
|
for (int colJ = 0; colJ < colNum; ++colJ) { \
|
|
|
|
|
|
dst[rowI * colNum + colJ] = src[colJ * rowNum + rowI]; \
|
|
|
|
|
|
} \
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>ȡ<EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD>еĶ<D0B5>ά<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(һά<D2BB><CEAC>cell<6C><6C>ÿ<EFBFBD><C3BF>cell<6C><6C><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>cell<6C><6C>ÿ<EFBFBD><C3BF>cell<6C><6C>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>)*/
|
|
|
|
|
|
bool ReadChildString2D(const string& filePath, const string& parentName, const string& selfName, vector<vector<string> >& vvStr) {
|
|
|
|
|
|
MATFile* pMatFile = nullptr;
|
|
|
|
|
|
mxArray* pMxArray = nullptr;
|
|
|
|
|
|
mxArray* pCell = nullptr;
|
|
|
|
|
|
int rowNum, colNum;
|
2023-10-07 04:21:54 +08:00
|
|
|
|
char *strBuf = new char[STRING_BUF_SIZE];
|
2023-10-05 10:38:21 +08:00
|
|
|
|
|
|
|
|
|
|
pMatFile = matOpen(filePath.c_str(), "r"); //<2F><><EFBFBD><EFBFBD>.mat<61>ļ<EFBFBD>
|
|
|
|
|
|
if (pMatFile == nullptr) {
|
|
|
|
|
|
cout << "filePath is error!" << endl;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
mxArray* pMxParent = matGetVariable(pMatFile, parentName.c_str()); //<2F><>ȡG<C8A1><47><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
pMxArray = mxGetField(pMxParent, 0, selfName.c_str()); // ds
|
|
|
|
|
|
rowNum = (int)mxGetM(pMxArray);
|
|
|
|
|
|
colNum = (int)mxGetN(pMxArray);
|
|
|
|
|
|
for (int i = 0; i < rowNum; ++i) {
|
|
|
|
|
|
for (int j = 0; j < colNum; ++j) {
|
|
|
|
|
|
pCell = mxGetCell(pMxArray, j * rowNum + i);
|
|
|
|
|
|
int childRowNum = (int)mxGetM(pCell);
|
|
|
|
|
|
int childColNum = (int)mxGetN(pCell);
|
|
|
|
|
|
vvStr.push_back(vector<string>());
|
|
|
|
|
|
vvStr.back().resize(childRowNum * childColNum);
|
|
|
|
|
|
for (int ii = 0; ii < childRowNum; ii++) {
|
|
|
|
|
|
for (int jj = 0; jj < childColNum; jj++) {
|
|
|
|
|
|
mxArray* pChildCell = mxGetCell(pCell, jj * childRowNum + ii);
|
|
|
|
|
|
if (mxGetString(pChildCell, strBuf, STRING_BUF_SIZE) != 0) {
|
|
|
|
|
|
cout << "String is too large to fit in the buffer! " << i + 1 << '\t' << j + 1 << endl;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
vvStr.back()[ii * childColNum + jj] = strBuf;
|
|
|
|
|
|
// auto& lastStr = vvStr.back()[ii * childColNum + jj];
|
|
|
|
|
|
// transform(lastStr.begin(), lastStr.end(), lastStr.begin(), ::toupper); // ת<>ɴ<EFBFBD>д
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
mxDestroyArray(pMxArray);
|
2023-10-07 04:21:54 +08:00
|
|
|
|
delete[]strBuf;
|
2023-10-05 10:38:21 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>ȡ<EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD>еĶ<D0B5>άdouble<6C><65><EFBFBD><EFBFBD>(һά<D2BB><CEAC>cell<6C><6C>ÿ<EFBFBD><C3BF>cell<6C><6C><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>cell<6C><6C>ÿ<EFBFBD><C3BF>cell<6C><6C>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>)*/
|
|
|
|
|
|
bool ReadChildDouble2D(const string& filePath, const string& parentName, const string& selfName, vector<vector<double> >& vvDouble) {
|
|
|
|
|
|
MATFile* pMatFile = nullptr;
|
|
|
|
|
|
mxArray* pMxArray = nullptr;
|
|
|
|
|
|
mxArray* pCell = nullptr;
|
|
|
|
|
|
int rowNum, colNum;
|
|
|
|
|
|
|
|
|
|
|
|
pMatFile = matOpen(filePath.c_str(), "r"); //<2F><><EFBFBD><EFBFBD>.mat<61>ļ<EFBFBD>
|
|
|
|
|
|
if (pMatFile == nullptr) {
|
|
|
|
|
|
cout << "filePath is error!" << endl;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
mxArray* pMxParent = matGetVariable(pMatFile, parentName.c_str()); //<2F><>ȡG<C8A1><47><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡdouble<6C><65><EFBFBD><EFBFBD>
|
|
|
|
|
|
pMxArray = mxGetField(pMxParent, 0, selfName.c_str()); // ds
|
|
|
|
|
|
rowNum = (int)mxGetM(pMxArray);
|
|
|
|
|
|
colNum = (int)mxGetN(pMxArray);
|
|
|
|
|
|
for (int i = 0; i < rowNum; ++i) {
|
|
|
|
|
|
for (int j = 0; j < colNum; ++j) {
|
|
|
|
|
|
pCell = mxGetCell(pMxArray, j * rowNum + i);
|
|
|
|
|
|
int childRowNum = (int)mxGetM(pCell);
|
|
|
|
|
|
int childColNum = (int)mxGetN(pCell);
|
|
|
|
|
|
|
|
|
|
|
|
vvDouble.push_back(vector<double>());
|
|
|
|
|
|
vvDouble.back().resize(childRowNum * childColNum);
|
|
|
|
|
|
double* pVal = (double*)mxGetData(pCell); //<2F><>ȡָ<C8A1><D6B8>
|
|
|
|
|
|
TRANS_ROW_COL(vvDouble.back(), pVal, childRowNum, childColNum); // <20><><EFBFBD>д洢<D0B4><E6B4A2>ʽת<CABD><D7AA>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
mxDestroyArray(pMxArray);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-19 11:17:43 +08:00
|
|
|
|
/* <20><>ȡ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
bool ReadMtxString(const string& filePath, const string& mtxName,
|
|
|
|
|
|
vector<string>& vStr, int* pRowNum, int* pColNum) {
|
|
|
|
|
|
|
|
|
|
|
|
MATFile* pMatFile = nullptr;
|
|
|
|
|
|
mxArray* pMxArray = nullptr;
|
|
|
|
|
|
mxArray* pCell = nullptr;
|
|
|
|
|
|
int rowNum, colNum;
|
|
|
|
|
|
char strBuf[STRING_BUF_SIZE];
|
|
|
|
|
|
|
|
|
|
|
|
pMatFile = matOpen(filePath.c_str(), "r"); //<2F><><EFBFBD><EFBFBD>.mat<61>ļ<EFBFBD>
|
|
|
|
|
|
if (pMatFile == nullptr) {
|
2023-09-19 23:36:04 +08:00
|
|
|
|
cout << "filePath is error!" << endl;
|
2023-09-19 11:17:43 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
pMxArray = matGetVariable(pMatFile, mtxName.c_str()); //<2F><>ȡ.mat<61>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪmatrixName<6D>ľ<EFBFBD><C4BE><EFBFBD>
|
|
|
|
|
|
rowNum = (int)mxGetM(pMxArray);
|
|
|
|
|
|
colNum = (int)mxGetN(pMxArray);
|
|
|
|
|
|
|
|
|
|
|
|
vStr.resize(rowNum * colNum);
|
|
|
|
|
|
for (int i = 0; i < rowNum; ++i) {
|
|
|
|
|
|
for (int j = 0; j < colNum; ++j) {
|
|
|
|
|
|
pCell = mxGetCell(pMxArray, j * rowNum + i);
|
|
|
|
|
|
if (mxGetString(pCell, strBuf, STRING_BUF_SIZE) != 0) {
|
2023-09-19 23:36:04 +08:00
|
|
|
|
cout << "String is too large to fit in the buffer! " << i + 1 << '\t' << j + 1 << endl;
|
2023-09-19 11:17:43 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
vStr[i * colNum + j] = strBuf;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-09-21 15:24:14 +08:00
|
|
|
|
*pRowNum = rowNum;
|
|
|
|
|
|
*pColNum = colNum;
|
2023-09-19 11:17:43 +08:00
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>mat<61>ļ<EFBFBD><C4BC>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶľ<C6B5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
|
|
|
|
|
T* ReadMtxDouble(const string& filePath, const string& mtxName, int* pRowNum, int* pColNum) {
|
|
|
|
|
|
T* dst = nullptr;
|
|
|
|
|
|
MATFile* pMatFile = nullptr;
|
|
|
|
|
|
mxArray* pMxArray = nullptr;
|
|
|
|
|
|
int rowNum, colNum;
|
|
|
|
|
|
double* matData;
|
|
|
|
|
|
pMatFile = matOpen(filePath.c_str(), "r"); //<2F><><EFBFBD><EFBFBD>.mat<61>ļ<EFBFBD>
|
|
|
|
|
|
if (pMatFile == nullptr) {
|
2023-09-19 23:36:04 +08:00
|
|
|
|
cout << "filePath is error!" << endl;
|
2023-09-19 11:17:43 +08:00
|
|
|
|
return nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
pMxArray = matGetVariable(pMatFile, mtxName.c_str()); //<2F><>ȡ.mat<61>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪmatrixName<6D>ľ<EFBFBD><C4BE><EFBFBD>
|
|
|
|
|
|
rowNum = (int)mxGetM(pMxArray);
|
|
|
|
|
|
colNum = (int)mxGetN(pMxArray);
|
|
|
|
|
|
// cout << rowNum << " " << colNum << endl;
|
|
|
|
|
|
matData = (double*)mxGetData(pMxArray); //<2F><>ȡָ<C8A1><D6B8>
|
|
|
|
|
|
|
|
|
|
|
|
dst = new T[rowNum * colNum];
|
|
|
|
|
|
for (int i = 0; i < rowNum; ++i) {
|
|
|
|
|
|
for (int j = 0; j < colNum; ++j) {
|
|
|
|
|
|
dst[i * colNum + j] = T(matData[j * rowNum + i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
mxDestroyArray(pMxArray); //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|
|
|
|
|
matClose(pMatFile); // <20>ر<EFBFBD><D8B1>ļ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
*pRowNum = rowNum;
|
|
|
|
|
|
*pColNum = colNum;
|
|
|
|
|
|
return dst;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>mat<61>ļ<EFBFBD><C4BC>У<EFBFBD><D0A3>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
bool SaveMtxDouble(T* src, MATFile* pMatFile, string matrixName, int rowNum, int colNum)
|
|
|
|
|
|
{
|
|
|
|
|
|
//ת<>ô洢
|
|
|
|
|
|
int datasize = colNum * rowNum;
|
|
|
|
|
|
double* mtxData = new double[datasize];//<2F><><EFBFBD>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD>תΪdouble<6C><65>ʽ
|
|
|
|
|
|
// memset(mtxData, 0, datasize * sizeof(double));
|
|
|
|
|
|
if (pMatFile == nullptr)
|
|
|
|
|
|
{
|
2023-09-19 23:36:04 +08:00
|
|
|
|
cout << "mat file pointer is error!" << endl;
|
2023-09-19 11:17:43 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
for (int i = 0; i < rowNum; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int j = 0; j < colNum; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
mtxData[j * rowNum + i] = double(src[i * colNum + j]);
|
|
|
|
|
|
// *(mtxData + j * rowNum + i) = (double)src[i * colNum + j]; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
mxArray* pWriteArray = NULL;//matlab<61><62>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>rowNum*colNum<75>ľ<EFBFBD><C4BE><EFBFBD>
|
|
|
|
|
|
pWriteArray = mxCreateDoubleMatrix(rowNum, colNum, mxREAL);
|
|
|
|
|
|
//<2F><>data<74><61>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>pWriteArrayָ<79><D6B8>
|
|
|
|
|
|
memcpy((void*)(mxGetPr(pWriteArray)), (void*)mtxData, sizeof(double) * datasize);
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪmatrixName
|
|
|
|
|
|
matPutVariable(pMatFile, matrixName.c_str(), pWriteArray);
|
|
|
|
|
|
|
|
|
|
|
|
mxDestroyArray(pWriteArray);//release resource
|
|
|
|
|
|
delete[]mtxData;//release resource
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|