matlab中调用C和cmd命令
2014-04-13 20:01
169 查看
转自:http://bbs.06climate.com/forum.php?mod=viewthread&tid=15533
Matlab的确是门简单易用的语言,而且有极为丰富的工具箱,网络上也有大把的例子,像一般性的信号处理与画图用matlab方便快捷。跟着文献里面的介绍研究一些处理方法,个人觉得用matlab做较少数据的实验还是很方便的,用很多现成的工具拼接起来就可以实现某个具体算法,如果效果可以,有必要再用如fortran之类的整个重写。
最开始我是抱着这个想法使用matlab的,然后matlab写了一大堆东西,对matlab的依赖变得很大,都不想用其他语言来改了。特别是一想到内存要自己申请、自己管理,头就大了起来。但是真正要处理的数据又非常大,最初自己用matlab写的代码算起来异常的慢,于是开寻求用其他语言来写(fortran,python之类的都折腾了下),然后绕了个大弯又回来了——选择使用matlab+c的编程模式。
就matlab本身而言,尽量不使用显示循环,如for语句。很多时候,用for语言进行相关的计算,可以将计算公式向量化,构造成几个矩阵之间的运算。
必须要使用for循环而且涉及很多逻辑判断之类的,循环次数较多,就用c语言完成,然后在matlab下编译为matlab可以直接调用的函数,涉及到使用matlab的mex。
Matlab调用c的话,可以参考这篇http://blog.sina.com.cn/s/blog_4a1f320b0100u9il.html,更详细的看这篇http://blog.csdn.net/zc02051126/article/details/8586602。注意matlab传入的数据类型,一定要与c的对应起来,否则结果出现奇怪的结果(我之前就是c代码中定义的数据为double,但是matlab中传进去的是single,我一直认为matlab的应该是double,这个错误调了很久)。另外,如果是要进行字符在matlab和c之间传递,就会困难些。
另外,经常计算结果是大量的零散文件(如一天有上千个,而有几百天的数据,分在不同文件夹下),手动的其归档很麻烦,linux下面用shell归档貌似很方便,不过好久没用。我一般在cmd下使用copy命令来归档,由于可以使用通配符,很方便。但是不可能多个文件夹你的数据都自己去做,于是尝试使用matlab中的system和dos命令来完成文件归档相关操作。这里面需要动态生成命令,可以使用sprintf来实现,注意文件路径中用'\'表示,这个c语言是一样的,使用转义字符,即'\\'表示'\',否则会出错。给个例子:
for m1=1:length(dirs1)
if(length(dirs1(m1).name)>2)
command=sprintf('copy
"%s\\%s\\*WL.dat""%s\\%s_WL.dat"',filepath,...,
dirs1(m1).name,resultfolder,dirs1(m1).name);
system(command);
end
end
command内容的形式如下(很简单的cmd命令,cmd下输入 help copy了解更多):
copy "D:\2010_20_30\result\2010.001\*WL.dat" "D:\2010_20_30\classify_data\DOY\2010.001_WL.dat"
即是将2010.001内的所有满足*WL.dat形式的文件复制到结果目录中2010.001_WL.dat中,system(command)就是通过cmd完成这一命令。
归档之后,想要使用GMT批量的画图,画图的批处理文件写好后,个人觉得一个一个来处理很麻烦,也结合matlab的dos()写了几句代码。注意要在代码的开头使用cd()将当前目录改为批处理(*.bat)文件所在的目录,否则批处理文件不能正确运行。一个例子:
functionGMT_bat(datafolder,parentfolder,resultfolder)
%GMT_bat对指定文件夹下的数据,使用GMT分别输出所有数据的矢量图
%注意在数据文件夹的同一目录下,放入以 GMT_WL.bat 命名的批处理文件
%Detailedexplanation goes here
%sourcefolder 待处理数据所在路径
%parentfolder 批处理文件所在路径,所有数据文件夹的父目录
%resultfolder 结果存放路径
data_folder=datafolder;
source_folder=parentfolder;
result_folder=resultfolder;
temp_path=[source_folder,'\','temp_file'];
mkdir(temp_path);
ommand0=sprintf('copy
%s\\GMT_WL.bat" %s\\GMT_WL.bat"',source_folder,...,
temp_path);
system(command0);
cd(temp_path); %将当前目录更改为存放批处理文件GMT_WL.bat的目,否则bat文件不能正确运行
dir1=dir(data_folder);
for m1=1:length(dir1)
if(length(dir1(m1).name)>2)
command1=sprintf('copy
"%s\\%s""%s\\WL.dat"',data_folder,...,
dir1(m1).name,temp_path);
system(command1);
command2=sprintf('%s\\GMT_WL.bat',temp_path);
dos(command2);
command3=sprintf('copy
%s\\WL.ps" %s\\%s_WL.ps"',temp_path,...,
result_folder,dir1(m1).name);
system(command3);
end
end
try
rmdir(temp_path,'s');
end
end
经常在论坛逛,学到不少东西。第一次发帖,算是一点点心得总结吧。
Matlab的确是门简单易用的语言,而且有极为丰富的工具箱,网络上也有大把的例子,像一般性的信号处理与画图用matlab方便快捷。跟着文献里面的介绍研究一些处理方法,个人觉得用matlab做较少数据的实验还是很方便的,用很多现成的工具拼接起来就可以实现某个具体算法,如果效果可以,有必要再用如fortran之类的整个重写。
最开始我是抱着这个想法使用matlab的,然后matlab写了一大堆东西,对matlab的依赖变得很大,都不想用其他语言来改了。特别是一想到内存要自己申请、自己管理,头就大了起来。但是真正要处理的数据又非常大,最初自己用matlab写的代码算起来异常的慢,于是开寻求用其他语言来写(fortran,python之类的都折腾了下),然后绕了个大弯又回来了——选择使用matlab+c的编程模式。
就matlab本身而言,尽量不使用显示循环,如for语句。很多时候,用for语言进行相关的计算,可以将计算公式向量化,构造成几个矩阵之间的运算。
必须要使用for循环而且涉及很多逻辑判断之类的,循环次数较多,就用c语言完成,然后在matlab下编译为matlab可以直接调用的函数,涉及到使用matlab的mex。
Matlab调用c的话,可以参考这篇http://blog.sina.com.cn/s/blog_4a1f320b0100u9il.html,更详细的看这篇http://blog.csdn.net/zc02051126/article/details/8586602。注意matlab传入的数据类型,一定要与c的对应起来,否则结果出现奇怪的结果(我之前就是c代码中定义的数据为double,但是matlab中传进去的是single,我一直认为matlab的应该是double,这个错误调了很久)。另外,如果是要进行字符在matlab和c之间传递,就会困难些。
另外,经常计算结果是大量的零散文件(如一天有上千个,而有几百天的数据,分在不同文件夹下),手动的其归档很麻烦,linux下面用shell归档貌似很方便,不过好久没用。我一般在cmd下使用copy命令来归档,由于可以使用通配符,很方便。但是不可能多个文件夹你的数据都自己去做,于是尝试使用matlab中的system和dos命令来完成文件归档相关操作。这里面需要动态生成命令,可以使用sprintf来实现,注意文件路径中用'\'表示,这个c语言是一样的,使用转义字符,即'\\'表示'\',否则会出错。给个例子:
for m1=1:length(dirs1)
if(length(dirs1(m1).name)>2)
command=sprintf('copy
"%s\\%s\\*WL.dat""%s\\%s_WL.dat"',filepath,...,
dirs1(m1).name,resultfolder,dirs1(m1).name);
system(command);
end
end
command内容的形式如下(很简单的cmd命令,cmd下输入 help copy了解更多):
copy "D:\2010_20_30\result\2010.001\*WL.dat" "D:\2010_20_30\classify_data\DOY\2010.001_WL.dat"
即是将2010.001内的所有满足*WL.dat形式的文件复制到结果目录中2010.001_WL.dat中,system(command)就是通过cmd完成这一命令。
归档之后,想要使用GMT批量的画图,画图的批处理文件写好后,个人觉得一个一个来处理很麻烦,也结合matlab的dos()写了几句代码。注意要在代码的开头使用cd()将当前目录改为批处理(*.bat)文件所在的目录,否则批处理文件不能正确运行。一个例子:
functionGMT_bat(datafolder,parentfolder,resultfolder)
%GMT_bat对指定文件夹下的数据,使用GMT分别输出所有数据的矢量图
%注意在数据文件夹的同一目录下,放入以 GMT_WL.bat 命名的批处理文件
%Detailedexplanation goes here
%sourcefolder 待处理数据所在路径
%parentfolder 批处理文件所在路径,所有数据文件夹的父目录
%resultfolder 结果存放路径
data_folder=datafolder;
source_folder=parentfolder;
result_folder=resultfolder;
temp_path=[source_folder,'\','temp_file'];
mkdir(temp_path);
ommand0=sprintf('copy
%s\\GMT_WL.bat" %s\\GMT_WL.bat"',source_folder,...,
temp_path);
system(command0);
cd(temp_path); %将当前目录更改为存放批处理文件GMT_WL.bat的目,否则bat文件不能正确运行
dir1=dir(data_folder);
for m1=1:length(dir1)
if(length(dir1(m1).name)>2)
command1=sprintf('copy
"%s\\%s""%s\\WL.dat"',data_folder,...,
dir1(m1).name,temp_path);
system(command1);
command2=sprintf('%s\\GMT_WL.bat',temp_path);
dos(command2);
command3=sprintf('copy
%s\\WL.ps" %s\\%s_WL.ps"',temp_path,...,
result_folder,dir1(m1).name);
system(command3);
end
end
try
rmdir(temp_path,'s');
end
end
经常在论坛逛,学到不少东西。第一次发帖,算是一点点心得总结吧。
相关文章推荐
- VS2008 C++ 调用MATLAB 2009b 生成的DLL
- c++与matlab混合编程,vs2010中调用.mat文件
- MATLAB调用C程序、调试和LDPC译码
- C# Matlab 相互调用
- [转载]PSCAD调用MATLAB/SIMULINK之接口元件设计
- Libsvm的MATLAB调用和交叉验证
- VS2013调用matlab生成的dll
- java/eclipse调用matlab功能函数
- eclipse调试java调用matlab程序的7.17dll找不到的问题
- 使用Matlab调用摄像头及保存视频
- 解决了java+matlab混编+web(jsp)调用Matlab,网页中显示Figure,详细实例
- matlab调用opencv库
- Matlab调用DLL
- VS调用Matlab Engine方法
- 怎么把matlab 训练的model 保存下来 然后在opencv 中调用
- matlab 调用dos命令和文件操作
- vc调用matlab的m文件混合编程(引擎方式)
- vc调用matlab动态链接库的文件头设置
- VC调用matlab dll方式混合编程(c风格--例2)<二>
- c#调用matlab m文件生成的.dll时出现JVM(java虚拟内存)不足