matlab与C++以.mat文件方式进行数据相互流动

年前,放假回家之前,使用了C++与matlab之间的数据的互动的一个实验,感觉效果挺好。初步达到了目的,所以整理下来方便大家使用。减少大家编程学习的时间。
希望对你们有用。

#include "mat.h"

void example8()
{
   const char **fnames;       /* pointers to field names */
    const mwSize *dims;
    mxArray    *tmp, *fout;
    char       *pdata=NULL;
    int        i_field, nfields;
    mxClassID  *classIDflags;
    mwIndex    j_struct;
    mwSize     NumStructRecords;
    mwSize     ndim;

	MATFile *pMF;
	mxArray *pRoad, *pOut;
	int status;
	const char *file = "ContourRoadResults_AfterWidthEtcCorrect_4_ZY.mat";

	printf("Opening file %s...\n\n", file);
	pMF = matOpen(file, "u");
	pRoad=matGetVariable(pMF, "ContourRoadResults");

    /* get input arguments */
    nfields = mxGetNumberOfFields(pRoad);
    NumStructRecords = mxGetNumberOfElements(pRoad);
    /* allocate memory  for storing classIDflags */
    classIDflags = (mxClassID*) mxCalloc(nfields, sizeof(mxClassID));

    /* check empty field, proper data type, and data type consistency;
     * and get classID for each field. */
    for(i_field=0; i_field<nfields; i_field++)
	{
        for(j_struct = 0; j_struct < NumStructRecords; j_struct++)
		{
            tmp = mxGetFieldByNumber(pRoad, j_struct, i_field);
            if(tmp == NULL)
			{
                printf("%s%d\t%s%d\n", "FIELD: ", i_field+1, "STRUCT INDEX :", j_struct+1);
                //mexErrMsgIdAndTxt( "MATLAB:phonebook:fieldEmpty", "Above field is empty!");
            }

            if(j_struct==0)
			{
                if( (!mxIsChar(tmp) && !mxIsNumeric(tmp)) || mxIsSparse(tmp)) {
                    printf("%s%d\t%s%d\n", "FIELD: ", i_field+1, "STRUCT INDEX :", j_struct+1);
                   // mexErrMsgIdAndTxt( "MATLAB:phonebook:invalidField",
                   //         "Above field must have either string or numeric non-sparse data.");
                }
                classIDflags[i_field]=mxGetClassID(tmp);
            }
			else
			{
                if (mxGetClassID(tmp) != classIDflags[i_field])
				{
                    printf("%s%d\t%s%d\n", "FIELD: ", i_field+1, "STRUCT INDEX :", j_struct+1);
                    //mexErrMsgIdAndTxt( "MATLAB:phonebook:invalidFieldType",
                    //        "Inconsistent data type in above field!");
                } else if(!mxIsChar(tmp) &&
                        ((mxIsComplex(tmp) || mxGetNumberOfElements(tmp)!=1))){
                    printf("%s%d\t%s%d\n", "FIELD: ", i_field+1, "STRUCT INDEX :", j_struct+1);
                    //mexErrMsgIdAndTxt( "MATLAB:phonebook:fieldNotRealScalar",
                    //        "Numeric data in above field must be scalar and noncomplex!");
                }
            }
        }
    }

    /* allocate memory  for storing pointers */
    fnames = (const char **)mxCalloc(nfields, sizeof(*fnames));
    /* get field name pointers */
    for (i_field=0; i_field< nfields; i_field++){
        fnames[i_field] = (char*)mxGetFieldNameByNumber(pRoad,i_field);
    }

    /* create a 1x1 struct matrix for output  */
    pOut = mxCreateStructMatrix(1,1,nfields, fnames);
    mxFree((void *)fnames);
    ndim = mxGetNumberOfDimensions(pRoad);
    dims = mxGetDimensions(pRoad);
    for(i_field=0; i_field<nfields; i_field++) {
        /* create cell/numeric array */
        if(classIDflags[i_field] == mxCHAR_CLASS) {
            fout = mxCreateCellArray(ndim, dims);
        }else {
            fout = mxCreateNumericArray(ndim, dims, classIDflags[i_field], mxREAL);
            pdata = (char*)mxGetData(fout);
        }
        /* copy data from input structure array */
        for (j_struct=0; j_struct<NumStructRecords; j_struct++) {
            tmp = mxGetFieldByNumber(pRoad,j_struct,i_field);
            if( mxIsChar(tmp)) {
                mxSetCell(fout, j_struct, mxDuplicateArray(tmp));
            }else {
                mwSize     sizebuf;
                sizebuf = mxGetElementSize(tmp);
                memcpy(pdata, mxGetData(tmp), sizebuf);
                pdata += sizebuf;
            }
        }
        /* set each field in output structure */
        mxSetFieldByNumber(pOut, 0, i_field, fout);
    }

	matPutVariable(pMF, "OutputResult_Convert",pOut);
    mxFree(classIDflags);
	if (matClose(pMF) != 0) {
		printf("Error closing file %s\n",file);
		return;
	}
	printf("Done\n");
	return;
}

项目需要进行事先的C++ MEX混合编程的标准配置,再此不再赘述。要提醒的是,需要加入的头文件是#include "mat.h"。另外,具体的其他函数,请参照matlab的 MAT文件的读写的相关内容。

这个帮助对相关函数说明比较详细,参照相关的demo文件,你就能很快上手。

祝愿能解决你的问题!

时间: 2024-10-12 13:41:37

matlab与C++以.mat文件方式进行数据相互流动的相关文章

Python 之 h5py 读取 matlab 中 .mat 文件 cell 方法浅析

采用 Python 读取 matlab 中 .mat文件的方法有很多,中外文的论坛上都不少,相关博文 可见:Python 从 mat 文件的读写和存储 到 h5py 文件包. 详址:http://blog.csdn.net/u013630349/article/details/47090299 但是,在读取matlab文件的时候,往往不是一层 .mat 就足以解决问题的,.mat 文件中可能是存放的 cell(100*200) 数据, cell(100*200)数据中又分为多个 cell .那么

利用Python读取Matlab的Mat文件内容

手头有别人写的Matlab程序,其中用到了Mat文件.现在不想安装Matlab,却又想读取Mat文件内容,该怎么办呢? 感谢scipy!!! 1 import scipy.io 2 3 data = scipy.io.loadmat('1.mat') # 假设文件名为1.mat 4 # data类型为dictionary 5 print data.keys() # 即可知道Mat文件中存在数据名,假设存在'x', 'y'两列数据 6 print data['x'] 7 print data['y

MAT文件操作

o李YZo 原文 MAT文件打开方法汇总及其他操作 MAT文件简介 为MATLAB使用的一种特有的二进制数据文件.MAT文件可以包含一个或者多个MATLAB 变量.MATLAB通常采用MAT文件把工作空间的变量存储在磁盘里,在MAT文件中不仅保存各变量数据本身,而且同时保存变量名以及数据类型等.所以在MATLAB中载入某个MAT文件后,可以在当前MATLAB工作空间完全再现当初保存该MAT 文件时的那些变量.这是其他文件格式所不能的.同样,用户也可以使用MAT文件从MATLAB环境中导出数据.M

Android 读写文件的第一种方式(文件方式)

文件方式保存数据,保存路径为/data/data/<packagename>/files/.有两种模式:MODE_PRIVATE 和 MODE_APPEND,其中 MODE_PRIVATE 是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而 MODE_APPEND 则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件. 1 public void save() { 2 String data = "Data to save"; 3

matlab结构体形式保存数据生成.mat文件&lt; 转&gt;

2015年 参加天池大数据竞赛 为了建立模型,打算基于matlab使用Random Forest Algorithm的工具包 该工具包我在此分享给大家,http://yunpan.cn/cVXsjQvh8ARcx  访问密码 30a3 该工具包导入的数据格式就是我如下所说的封装方式,因此,在使用该算法包时,需要把自己的数据进行封装一下. 通过matlab打开,可以知道twonorm.mat里面还封装了两个.mat文件. 我们看看工具包的作者给的tutorial 部分源码如下: 的源码如下: 说明

保存MATLAB中间变量值的方法:保存为txt文件或者mat文件

1.直接保存为TXT文件: 具体的命令是:用save *.txt -ascii x (x为变量: *.txt为文件名,该文件存储于当前工作目录下,再打开就可以 打开后,数据有可能是以指数形式保存的.) 例子: a =[17 24 1 8 15;23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 ]: save afile.txt -ascii a afile.txt打开之后,是这样的: 1.7000000e+001 2.4000000e+00

MATLAB实例:将批量的图片保存为.mat文件

MATLAB实例:将批量的图片保存为.mat文件 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 图片数据:horse.rar 1. MATLAB程序 clc; clear all; num = 17; for i = 1 : num IM = imread(sprintf('E:\\将批量的图片保存为mat\\horse\\horse%03d.jpg', i)); eval(sprintf('IM%d = IM;', i)); end str =

matlab 生成mat文件

生成MAT文件 假如你的矩阵A.B都已赋值,现在需要将A,B矩阵保存成mat格式文件,执行如下命令:save mydata A B 就会把A B矩阵数据保存在yourdata.dat文件中了 保存指定数据为MAT文件:假如我们只想保存A矩阵,那么,我们可以用如下命令:save mydata2 A 回车 这样就可以将矩阵A单独保存起来了 保存所有数据为MAT文件:如果有多个矩阵,我们都需要将其保存,如果我们这样写,save mydata2 A B C D....这样写会很麻烦,我们直接用下面命令便

python读取mat文件

一.mat文件 mat数据格式是Matlab的数据存储的标准格式.在Matlab中主要使用load()函数导入一个mat文件,使用save()函数保存一个mat文件.对于文件 load('data.mat') save('data_1.mat','A') 其中,'A'表示要保存的内容. 二.python中读取mat文件 在python中可以使用scipy.io中的函数loadmat()读取mat文件,函数savemat保存文件. 1.读取文件 如上例: #coding:UTF-8 import