gpt4 book ai didi

c++ - Matlab API 使用 STL 容器从 C++ 读取 .mat 文件

转载 作者:太空狗 更新时间:2023-10-29 19:43:29 25 4
gpt4 key购买 nike

我必须从 C++ 中读取一些 .mat 数据文件,我通读了文档,但我想知道如何以干净优雅的方式处理数据,例如using std:vector(modest .mat file size(10M~1G), 但内存问题要认真对待)

我的函数是这样的:

#include <stdio.h>
#include "mat.h"
#include <vector>

int matread(const char *file, const vector<double>& pdata_v) {

MATFile *pmat;

pmat=matOpen("data.mat","r");
if (pmat == NULL) {
printf("Error opening file %s\n", file);
return(1);
}
mxArray *pdata = matGetVariable(pmat, "LocalDouble");

// pdata -> pdata_v

mxDestroy pa1; // clean up
return 0;
}

所以,问题是,我怎样才能高效、安全地从 mxArray *pdata 数组复制到 vector pdata_v?

最佳答案

这是使用 MAT-API 的示例:

测试垫.cpp

#include "mat.h"
#include <iostream>
#include <vector>

void matread(const char *file, std::vector<double>& v)
{
// open MAT-file
MATFile *pmat = matOpen(file, "r");
if (pmat == NULL) return;

// extract the specified variable
mxArray *arr = matGetVariable(pmat, "LocalDouble");
if (arr != NULL && mxIsDouble(arr) && !mxIsEmpty(arr)) {
// copy data
mwSize num = mxGetNumberOfElements(arr);
double *pr = mxGetPr(arr);
if (pr != NULL) {
v.reserve(num); //is faster than resize :-)
v.assign(pr, pr+num);
}
}

// cleanup
mxDestroyArray(arr);
matClose(pmat);
}

int main()
{
std::vector<double> v;
matread("data.mat", v);
for (size_t i=0; i<v.size(); ++i)
std::cout << v[i] << std::endl;
return 0;
}

首先我们构建独立程序,并将一些测试数据创建为 MAT 文件:

>> mex -client engine -largeArrayDims test_mat.cpp

>> LocalDouble = magic(4)
LocalDouble =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

>> save data.mat LocalDouble

现在我们运行程序:

C:\> test_mat.exe
16
5
9
4
2
11
7
14
3
10
6
15
13
8
12
1

关于c++ - Matlab API 使用 STL 容器从 C++ 读取 .mat 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26234673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com