使用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来编写信号处理代码,最 ...
随机推荐
- Raft、Zab
Raft.Zab 引言 <分布式系统理论进阶 - Paxos>介绍了一致性协议Paxos,今天我们来学习另外两个常见的一致性协议--Raft和Zab.通过与Paxos对比,了解Raft和Z ...
- jq 7种实例化
$(html) ->$(array) $(html,{}||$(...)) $(#id) $(expr,$(...)) $(expr,context) $(dom) $(function(){} ...
- coolcarousel 图片轮播缩放问题
var myurl; var mydata; var mytype = "POST"; var jsonType = "json"; var htmlType ...
- 自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选&多选下拉框
先说点闲话,熟悉Angular的猿们会喜欢这个插件的. 00.本末倒置 不得不承认我是一个喜欢本末倒置的人,学生时代就喜欢先把晚交的作业先做,留着马上就要交的作业不做,然后慢悠悠做完不重要的作业,卧槽 ...
- 1049: [HAOI2006]数字序列 - BZOJ
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大.Input 第一行包含一个数n ...
- linux 下安装JDK1.7
安装JDK1.7 1. 打开网址http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u5-downloads-1591156.ht ...
- The 6th Zhejiang Provincial Collegiate Programming Contest->Problem I:A Stack or A Queue?
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3210 题意:给出stack和queue的定义,一个是先进后出(FILO), ...
- 修改tomcat的默认编码
在tomcat的安装路径下查找conf文件下的server.xml文件,修改此文件即可,修改内容如下: <Connector port="8080" protocol=&qu ...
- C++遍历目录,并把目录里超过7天的文件删除(跨平台windows&linux)
C++遍历目录,并把目录里超过7天的文件删除,适用于项目里删除过期的日志,或者视频文件. 在windows和linux下测试通过. windows测试结果: linux测试结果: 源码: #inclu ...
- Java经典书籍
Java Web开发教程---孙霞JSP应用开发详解(第三版)---刘晓华.张健.周慧贞Spring in Action---Craig Walls精通Struts基于MVC的Java Web设计与开 ...