使用C/C++读写.mat文件的方法详解
什么是.mat文件
.mat文件是一种MATLAB的数据格式,即它是MATLAB的数据文件。MATLAB(矩阵实验室)是美国MathWorks公司出品的商业数学软件。它主要用于算法开发、数据可视化、数据分析以及数值计算的统一性处理等。其数据的保存格式是以.mat文件格式进行保存的。
.mat文件的特点
.mat文件因为是MATLAB的数据文件,其数据类型也与MATLAB数据类型有关。通常保存的数据类型包括:
- 数组、向量、矩阵
- 结构体
- 字符串
- Cell数组
- 元胞数组
MATLAB在读取这些数据时采用按列读取的方式。注意:MATLAB读取数组,向量或矩阵时,都是按照矩阵形式存放的。
利用C/C++读取.mat文件
要读取MATLAB的 .mat 文件,需要用到MATLAB Engine API。MATLAB Engine API是MATLAB与C / C++的链接API。这个API使得C++程序可以调用MATLAB的函数,并传递参数;MATLAB函数也可以返回到 C++ 程序中。
使用MATLAB Engine API读取时,可以使用以下步骤:
- 引入Matlab必要的头文件
cpp
#include "mat.h" - 打开MATLAB引擎
cpp
Engine* m_pEngine;
m_pEngine = engOpen(NULL); - 读取MAT文件
```cpp
// 读取.mat文件
MATFile* pmatFile;
pmatFile = matOpen("example.mat","r");
//读取变量
mxArray* mxData;
mxData = matGetVariable(pmatFile, "data");
//读取完毕后,关闭MAT文件
matClose(pmatFile);
4. 获取数据
cpp
double data = mxGetPr(mxData);
int ndim = mxGetNumberOfDimensions(mxData);
const size_t dims = mxGetDimensions(mxData);
matName = mxArrayToString(mxDataName);
//做完以上的内容之后,将 mxData 释放掉
mxDestroyArray(mxData);
5. 关闭MATLAB引擎
cpp
engClose(m_pEngine);
```
一下是一个利用C++读取.mat文件的示例:
#include "mat.h"
#include <iostream>
#include <string>
#define BUFSIZE 256
int main()
{
// Start the MATLAB engine on the default host
std::cout << "Starting MATLAB engine..." << std::endl;
Engine *ep = engOpen(NULL);
if(ep == NULL)
{
std::cerr << "Can't start MATLAB engine." << std::endl;
return -1;
}
// Read data from .mat file
MATFile *pmat = NULL;
mxArray *pa = NULL;
std::cout << "Reading test.mat file." << std::endl;
pmat = matOpen("test.mat", "r");
if (pmat == NULL) {
std::cerr << "Error opening file test.mat." << std::endl;
return -1;
}
pa = matGetVariable(pmat, "data");
if (pa == NULL) {
std::cerr << "Error reading existing matrix data" << std::endl;
return -1;
}
// process data, then clean up
double *dataArray;
mwSize rows, cols;
rows = mxGetM(pa);
cols = mxGetN(pa);
std::cout << "Rows: " << rows << " Cols: " << cols << std::endl;
dataArray = mxGetPr(pa);
// clean up
mxDestroyArray(pa);
if (matClose(pmat) != 0) {
std::cerr << "Error closing file test.mat" << std::endl;
return -1;
}
// Shut down the MATLAB engine
if (engClose(ep) != 0) {
std::cerr << "Error closing MATLAB engine." << std::endl;
return -1;
}
std::cout << "Done." << std::endl;
return 0;
}
利用C/C++写入.mat文件
MATLAB引擎API的另外一种常见用法是将需要输出的数据存储到单个.mat文件中。通过以下步骤可以将数据存储到.mat文件中:
- 引入Matlab必要的头文件
cpp
#include "mat.h" - 打开MATLAB引擎
cpp
Engine* m_pEngine;
m_pEngine = engOpen(NULL); - 创建和存储MATLAB结构数组,以及变量的字符名称
```cpp
mxArray* matOut = NULL;
int numData = 3;
//定义一个结构:
typedef struct dataItem_ {
char property1[256];
char property2[256];
int property3;
} dataItem;
dataItem data[] =
{{"data1","yellow",26},
{"data2","blue",41},
{"data3","green",63}
};
int numProps = 3;
//创建结构
//第一个参数,数组的开始指针
//第二个参数,数组中的元素数目
//第三个参数,元素中结构体的数据
matOut = mxCreateStructMatrix(1, numData, numProps, (const char **)&field_names[0]);
//放置数据
for (int n=0; n<numData; n++) {
mxArray* mxData = NULL;
//放置property1数据
mxData = mxCreateString(data[n].property1);
mxSetField(matOut, n, field_names[0], mxData);
//放置property2数据
mxData = mxCreateString(data[n].property2);
mxSetField(matOut, n, field_names[1], mxData);
//放置property3数据
mxData = mxCreateDoubleScalar((double)data[n].property3);
mxSetField(matOut, n, field_names[2], mxData);
}
//定义输出的MATLAB变量名称
const char name = "data";
4. 存储数据到MATLAB引擎
cpp
//将数据存储到MAT文件中
MATFile pmatFile;
pmatFile = matOpen("output.mat", "w");
int status = matPutVariable(pmatFile, name, matOut);
if (status != 0)
printf("Error writing output to matlab\n");
//释放MATLAB数组
mxDestroyArray(matOut);
matClose(pmatFile);
5. 关闭MATLAB引擎
cpp
engClose(m_pEngine);
```
以下是一个利用C++写入.mat文件的示例:
#include "mat.h"
#include <iostream>
#include <string>
#define BUFSIZE 256
int main()
{
// Start the MATLAB engine on the default host
std::cout << "Starting MATLAB engine..." << std::endl;
Engine *ep = engOpen(NULL);
if(ep == NULL)
{
std::cerr << "Can't start MATLAB engine." << std::endl;
return -1;
}
// Generate some sample data
std::string dataString = "Hello, World!";
mxArray *pa = mxCreateString(dataString.c_str());
if(pa == NULL)
{
std::cerr << "Error creating mxArray." << std::endl;
return -1;
}
// Write data to .mat file
std::cout << "Writing sample_data.mat file." << std::endl;
MATFile *pmat = matOpen("sample_data.mat", "w");
if (pmat == NULL) {
std::cerr << "Error creating file sample_data.mat." << std::endl;
return -1;
}
if (matPutVariable(pmat, "data", pa) != 0) {
std::cerr << "Error saving data to file." << std::endl;
}
// clean up
mxDestroyArray(pa);
if (matClose(pmat) != 0) {
std::cerr << "Error closing file sample_data.mat" << std::endl;
return -1;
}
// Shut down the MATLAB engine
if (engClose(ep) != 0) {
std::cerr << "Error closing MATLAB engine." << std::endl;
return -1;
}
std::cout << "Done." << std::endl;
return 0;
}
以上是利用C / C++读写.mat文件的详细攻略。在使用时,需要引入MATLAB Engine API,并按照上述步骤逐步进行操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用C/C++读写.mat文件的方法详解 - Python技术站