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

简介:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "mat.h"<br data-filtered="filtered"><br data-filtered="filtered">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文件,你就能很快上手。

祝愿能解决你的问题!

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。


  本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5223671.html ,如需转载请自行联系原作者




相关文章
|
1月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
19 0
Linux c/c++文件的基本操作
|
2月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
1月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
44 0
|
1月前
|
Linux C++
Linux c/c++文件移动
这篇文章介绍了在Linux环境下,使用C/C++语言通过命令方式和文件操作方式实现文件移动的方法。
63 0
|
2月前
|
Linux API C++
超级好用的C++实用库之文件目录操作
超级好用的C++实用库之文件目录操作
28 0
|
3月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
45 2
|
3月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
2月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
19 0
|
3月前
|
监控 编译器 C++
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
70 0
|
3月前
|
安全 C++ Windows
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)