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

相关文章
|
7月前
|
SQL 分布式计算 数据挖掘
从Excel到高级工具:数据分析进阶指南
从Excel到高级工具:数据分析进阶指南
310 54
|
JavaScript 算法 前端开发
layui框架实战案例(16):xm-select下拉多选插件实战记录(远程搜索、过滤、翻页、单选、提示文字)
layui框架实战案例(16):xm-select下拉多选插件实战记录(远程搜索、过滤、翻页、单选、提示文字)
2931 0
|
搜索推荐 API
淘宝商品数据洞察:解锁精准营销新策略
在快速变化的商业环境中,高效的营销策略对企业至关重要。通过API获取淘宝APP的商品细节数据,企业可以精准分析产品特性、强化卖点,并制定灵活的价格策略。利用用户画像实现个性化营销,选择最佳渠道并优化内容,从而提升品牌影响力。这一方法不仅帮助企业抓住目标消费者,还能增强市场竞争力,促进长期发展。
Linux中将文件解压到指定目录
Linux中将文件解压到指定目录
1047 19
|
数据采集 监控 安全
网络爬虫是什么,它有什么作用?
网络爬虫是自动化工具,用于从网站中提取信息,通过追踪超链接和分析网页内容,实现互联网数据的自动搜集与整理。其工作流程包括选择起始URL、下载网页、解析HTML、跟踪链接、提取和存储数据及定期更新。主要用途涵盖数据挖掘、内容聚合、搜索引擎索引、价格比较、网站监控、学术研究及安全合规性等方面。然而,使用时需注意隐私、版权等法律问题。使用动态IP可避免触发网站反爬机制,如选用优质海外代理IP服务提高效率。
|
机器学习/深度学习 编解码 算法
什么是超分辨率?浅谈一下基于深度学习的图像超分辨率技术
超分辨率技术旨在提升图像或视频的清晰度,通过增加单位长度内的采样点数量来提高空间分辨率。基于深度学习的方法,如SRCNN、VDSR、SRResNet等,通过卷积神经网络和残差学习等技术,显著提升了图像重建的质量。此外,基于参考图像的超分辨率技术通过利用高分辨率参考图像,进一步提高了重建图像的真实感和细节。
|
Docker 容器
Docker export 和 save 区别
【8月更文挑战第3天】`docker export` 与 `docker save` 的关键区别在于处理对象和用途。`export` 将容器转为 `.tar` 文件,仅导出容器文件系统,不含元数据,适合快速备份或测试;`save` 则打包整个镜像及其元数据为 `.tar` 文件,用于镜像迁移或离线备份。前者通过 `import` 创建新镜像但无元数据,后者用 `load` 恢复完整镜像。
813 1
|
人工智能 Linux Docker
一文详解几种常见本地大模型个人知识库工具部署、微调及对比选型(1)
近年来,大模型在AI领域崭露头角,成为技术创新的重要驱动力。从AlphaGo的胜利到GPT系列的推出,大模型展现出了强大的语言生成、理解和多任务处理能力,预示着智能化转型的新阶段。然而,要将大模型的潜力转化为实际生产力,需要克服理论到实践的鸿沟,实现从实验室到现实世界的落地应用。阿里云去年在云栖大会上发布了一系列基于通义大模型的创新应用,标志着大模型技术开始走向大规模商业化和产业化。这些应用展示了大模型在交通、电力、金融、政务、教育等多个行业的广阔应用前景,并揭示了构建具有行业特色的“行业大模型”这一趋势,大模型知识库概念随之诞生。
156418 30
|
人工智能 API
大模型生成短视频
这篇文章详细介绍了如何利用大模型生成短视频,包括配置环境、对接视频素材网站以及生成视频的具体步骤。
313 4
大模型生成短视频
|
安全 应用服务中间件 PHP
中间件漏洞
中间件漏洞