使用VS2010调用matlab的mat格式文件
做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来。
C++读取mat文件的步骤如下。
1. vs2010的配置
新建一个工程,在属性管理器中选择 工程->属性->VC++目录。
设置包含目录为:D:\MATLAB\R2010a\extern\include(我的matlab装在D盘);
设置库目录为:D:\MATLAB\R2010a\extern\lib\win32\microsoft。
2.设置环境变量path
计算机->属性->高级系统设置->高级->环境变量
在Path中已经存在D:\MATLAB_2011a\R2011a\bin\,但是D:\MATLAB_2011a\R2011a\bin\win32下有个重要的libmat.dll。如果不把d:\MATLAB\R2010a\bin\改为D:\MATLAB_2011a\R2011a\bin\win32程序将无法运行。
理论上D:\MATLAB_2011a\R2011a\bin\应该会向深一步检索到libmat.dll。坑爹的windows这一步并没有去做。这步设置完后要重启(环境配置完毕)。
3.使用MATLAB 提供的MAT 文件接口函数
在C/C++程序中有两种方式可以读取MAT文件数据。利用MATLAB提供的有关MAT文件的编程接口函数。MATLAB的库函数中包含了MAT文件接口函数库,其中有各种对MAT文件进行读写的函数,都是以mat开头的函数。如表1所示。
表1 C语言中的MAT文件读写函数
MAT 函 数 功 能
matOpen打开 MAT 文件
matClose关闭 MAT 文件
matGetDir从 MAT 文件中获得 MATLAB 阵列的列表
matGetFp获得一个指向MAT 文件的ANSI C 文件指针
matGetVariable从MAT文件中读取MATLAB阵列
matPutVariable写MATLAB阵列到MAT文件
matGetNextVariable从MAT文件中读取下一个MATLAB阵列
matDeleteVariable从MAT文件中删去下一个MATLAB阵列
matPutVariableAsGlobal从MATLAB阵列写入到MAT文件中
matGetVariableInfo从MAT文件中读取MATLAB阵列头信息
matGetNextVariableInfo从MAT文件中读取下一个MATLAB阵列头信息
4.程序举例
读取.mat文件,并把mat内容存储在图像中并显示。
注意:在Studio中一定要注意,默认读取.mat的方式是按列读取,不是按行读取。这是matlab数据存储的特色!
#include "stdafx.h" int loadMat(Mat& regId)
{ MATFile *pmat;
const char **dir;
const char *file;
const char *name;
int ndir;
mxArray *pa; file="D:/labels3_ms.mat";//双反斜杠防止转义
pmat=matOpen(file, "r");//打开文件,返回指向文件指针
if (pmat == NULL) {
cout<<"Error opening file"<<file<<endl;
return();
} dir = (const char **)matGetDir(pmat, &ndir); //ndir 表示mat文件中含有矩阵数目
if (dir == NULL) {
std::cout<<"Error reading directory of file"<<file<<endl;
return();
}
else
{
cout<<"Error opening file"<<file<<endl;
for (int i=; i < ndir; i++)
cout<<"Mat NUM: "<<dir[i]<<endl;//输出所含矩阵数目
}
pmat=matOpen(file, "r");//重新打开文件;
pa = matGetNextVariable(pmat, &name); //返回指向文件头文件信息的指针,指针类型为*mxArray;
//name 是矩阵的名字;
cout<<name<<endl;
pmat=matOpen(file, "r");
int ii=mxGetM(pa);//矩阵行数400
int jj=mxGetN(pa);//矩阵列数300
int *pm=(int*)mxGetPr(pa); //获取矩阵数值,返回指向矩阵第一数值的指针;
regId=Mat::zeros(jj,ii,CV_8UC1); map<<span>int,int>regSize;
int m=;
for (int r=;r
{
int n=;
m++;
uchar *id=regId.ptr(r);
for (int c=;c
{
id[c]=(*pm);
pm++;
regSize[*pm]++;
}
} cout<<"regSize:"<<regSize.size()<<endl;
// for(map::iterator iter=regSize.begin();iter!=regSize.end();iter++)
// {
// cout<<iter->first<<" size: "<<iter->second<<endl;
// } mxFree(dir);
// //normalize(regId,regId,0,1,CV_MINMAX,CV_32FC1);
regId=regId.t();
//imshow("show",regId);
//waitKey();
//imwrite("D:/regId1.jpg",regId);
//return 1;
return regSize.size();
}
使用VS2010调用matlab的mat格式文件的更多相关文章
- 开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式
原文:[原创]开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式 开源Math.NET基础数学类库使用系列文章总目录: 1.开源.NET基础数学计算组件Math.NET( ...
- 【原创】开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【转】matlab针对不同格式文件的读写
本技术支持指南主要处理:ASCII, binary, and MAT files.要得到MATLAB中可用来读写各种文件格式的完全函数列表,可以键入以下命令: help iofun MATLAB中有两 ...
- vs2010调用matlab2011下的.m文件
很幸运在网上找到了采用引擎的方法,用vs2009调用matlab2008下的.m文件:但个人的环境是vs2010+matlab2011;想着二者差不多,故将s2010调用matlab2008拿来试试: ...
- java 调用OpenOffice将word格式文件转换为pdf格式
一:环境搭建 OpenOffice 下载地址http://www.openoffice.org/ JodConverter 下载地址http://sourceforge.net/projects/jo ...
- Matlab保存uint16格式文件的相关注意事项
在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算.在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型.如果 ...
- 【转】Java读取matlab的.mat数据文件
参考:Java读取mat文件 下载链接:ujmp jmatio 下载完两个.jar文件之后,如何引用到java项目当中?项目名称->右键->Property->Java Build ...
- matlab 生成mat文件
生成MAT文件 假如你的矩阵A.B都已赋值,现在需要将A,B矩阵保存成mat格式文件,执行如下命令:save mydata A B 就会把A B矩阵数据保存在yourdata.dat文件中了 保存指定 ...
- VS2015调用matlab Plot函数
最近经常采用Matlab仿真,然后C语言实现,最后需要将计算结果使用Qt的qwt或者matlab中的plot函数绘图. 因此想借用matlab的plot函数接口,使用VS2015来编写信号处理代码,最 ...
随机推荐
- GNU_makefile_template
#g++ compiler: options # -std=c++0x enables ISO C++ 11 standard # -I.. pulls in the Version_test.h f ...
- 第1章 Git的版本控制之道
版本控制系统(Version Control System,VCS)可以帮助我们记录和跟踪项目中各文件内容的修改变化. 1.1 版本库 版本库(Repository)是版本控制系统用来存储所有历史数据 ...
- 自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)
很多高端机械键盘,支持宏定义,例如我们可以设置"D"键为"dota",这样当我们按一下宏开启键,再按一下"D"键,就等价于分别按了" ...
- nginx配置location [=|~|~*|^~] /uri/ { … }用法
版权声明:https://github.com/wusuopubupt ====== nginx location语法 基本语法:location [=|~|~*|^~] /uri/ { … } = ...
- RE:转:一些不常用的html代码
1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...
- 浅谈Javascript 数组与字典
Javascript 的数组Array,既是一个数组,也是一个字典(Dictionary). 先举例看看数组的用法. var a = new Array(); a[0] = "Acer&q ...
- JAVA面试题:equals()方法和== 区别
http://bbs.csdn.net/topics/390000725 总结: equals在没重写之前和==一样,重写之后,equals只要内容一样即为true equals跟==一般情况下是等价 ...
- UIBezierPath画圆弧的记录
UIBezierPath通过 - (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)s ...
- Android:使用ViewPager实现左右滑动切换图片(图上有点点)
在以下实例的基础上加上点点 Android:使用ViewPager实现左右滑动切换图片 (简单版) 效果预览: 因为要把点点放图片上,所以修改布局为相对布局: <?xml version=&qu ...
- 一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础
来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,“招人啦.” 然某群友曰,“群主,俺想去.” LZ回之,“你年几何?” 群友曰,“两年也.” LZ憾言之,“惜 ...