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 ,如需转载请自行联系原作者




相关文章
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
22 12
|
1月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
42 5
|
1月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
4月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
50 0
Linux c/c++文件的基本操作
|
5月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
4月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
93 0
|
4月前
|
Linux C++
Linux c/c++文件移动
这篇文章介绍了在Linux环境下,使用C/C++语言通过命令方式和文件操作方式实现文件移动的方法。
126 0
|
5月前
|
Linux API C++
超级好用的C++实用库之文件目录操作
超级好用的C++实用库之文件目录操作
68 0
|
6月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
75 2