阅读目录
从大二开始接触到matlab,讲真,这是一个我觉得很良心的一个平台,之所以这样认为是因为matlab有个help功能,这里可以查询到所有的函数以及关键字的使用方法,但是可惜是英文版的,就比较难找到自己想要的函数功能,长时间里自己都是在百度里将自己所需要的函数功能说出,然后百度,一般都能找到,我觉得很有用的一个matlab论坛平台是MATLAB中文论坛
,这里有很多大牛,也欢迎大家去膜拜学习。这是我的第一篇博客,也是我人生中的一个新起点,刚过去一个灰色的大四,人生没有回头路,我只愿未来越来越美好。
我很感激博客园,在这里我学到了很多知识。
这篇博客是参考了另一位博客园作者大牛:数据之巅,http://www.cnblogs.com/asxinyu/p/Basic_Matlab_Experience.html。
1.前言
本文不是给完全没有过一定编程经验的人准备的。至少了解或看过过一些C编程什么的。
本文的范围很大,信息很多。由于本人在接下来研究生生活中将在Matlab下生存一年半多,本文将随时随地的更新,在这里,我会补填上很多,可能简单可能复杂吧,个人觉得就Matlab而言,其实没多复杂的东西,很多都可以自行百度的。
我的开发环境为windows10,Matlab2013b,我觉得系统和Matlab版本对学习影响不大,毕竟大家用的基本上都是2012以上的,所以版本影响不大。尤其是版本不是越高越好,适合自己的就好,说到底稳定能跑的动就行。
<注:未完待续...>
如何安装matlab,请自行百度,太多了。下图为Matlab2013b的界面
1.help栏:在这里,输入要查询的函数名,便可以得到想要的介绍及example等。
2.菜单栏:在这里,就是每部分的功能设置等,详细百度好了。
3.Current Folder栏:当前路径。是当前matlab工作文件夹的路径,这个一般启动改好后,不会变动,作用不大,但有时候找文件用得上;这里会加载你经常使用的Matlab目录,可以通过下拉箭头快速切换不同的Matlab工作路径;
4.Current Folder:也是当前的工作文件夹的文件显示,这里显示文件夹的所有资源,比较好懂,需要打开文件的时候,双击对应m文件就可以了;
5.Command Window 主窗口:也就是输入命令的地方,最最重要的地方吧,做一些简单的测试,学习命令的时候都可以在这里面进行,不过习惯后更喜欢用m文件,习惯就知道了;像先前提到的help栏,其实可以直接敲打>>help 函数名; 当然了其他的命令输入,如果需要换行,记得按:shift+Enter;另外主窗口还有一个好处是可以回显命令行的值(这条命令后不加“;”);
6.WorkSpace:工作变量空间,主要是显示当前matlab中存在的变量的值,包括变量名称,值,如果是数组,会显示最大,最小值,这个地方主要是调试程序用的,相当于VS中加断点后的局部变量的值,只不过这里显示更加直观,非常有用。
7.Command History:如其名,是历史窗口,这样你可以看到自己先前敲打的命令,这里有一个小技巧,就是你在命令窗口输入的命令,这里都会显示,而且你还可以用小键盘的,上下键来直接跳到前面的命令,测试的时候也更加方便;
8.状态栏:当程序在跑的时候,显示为busy,这时候电脑可能会卡的不要不要的,同时matlab窗口不动,不要着急,可以去泡杯水喝,等着吧,我就是这样干的。如果Ready,那么就是没有运行程序。
<注:未完待续...>
Matlab如此受欢迎的原因可以总结为:通过简单的编程,能达到高效的数值运算能力与绘图能力,完善的help。
经常使用Matlab的命令或者进行一些简单的测试,掌握和知道一些常见的命令是很有必要的,下面这些命令如果记不住,可以根据功能百度,找到对应的函数,再用,其实很快。熟练之后,也就30秒钟的事情,多了,也就记住了。
1.clc:清空命令主窗口(4)的内容.
2.clear:清空内存变量等.常用clear 某变量名 来在工作变量(5)中去除变量名,或者是clear all 来清空(5)的所有变量。
3.help:帮助命令,正如之前提到的help 某函数可以得到该函数的使用方法介绍和example。
4.zero:创建一个多维的零值数组,如a=zero(3,4)是一个3行4列的数组,其中值均为0。
5.rand:随机数生成,如R=rand([M,N])、R=rand(M,N)或rand(N)是一个M*N或者N*N维的数组,其值均为0~1之间的任意随机无理数数。
6.>>plot:绘制连续函数的操作;
>>stem:绘制离散函数的操作;
具体格式可以参考帮助,常见搭配有figure(1),subplot(2,2,1),axes,axis,legend(\' \'),xlabel(\' \'),ylabel(\' \'),title(\' \'),hold on,zoom in,gca等,详细如何使用可以help。
7.function:定义一个函数,在.m中经常用到,可以将很多段代码封装为一个函数,可以多次调用此函数,而不用重复写很多段代码,如function [a b]=test(haha),这里调用函数test之前,需要传递给它一个变量值,函数在运算完后,会返回[a b],调用方法如[a b]=test(5)。
8.global:声明一个全局变量在.fig中的.m中经常用到,这样的话此变量可以在多个函数中共享。
9.save:保存一个数据;
10.load:载入一个数据,为struct类型,通常要配合struct2cell才好调用,例如下面:
s = load(PathName);
s = struct2cell(s);
11.disp:显示一段话,例如disp(\'hello HongKong!Here is Shanghai, missing u\');。
12.imshow:显示一张图片。
13.pause:暂停,此时需要在Command Window(5)键盘敲击下Enter键便可以继续运行代码:
好了,matlab中的常用的这些函数就介绍到这里了,要掌握matlab的核心语法,还得看一下基本的matlab矩阵操作的语法,太灵活了 ,掌握几个基本的就可以完成很多工作了。
<注:未完待续...>
前面已经提到Matlab最重要的一点强大的数值计算功能,不仅体现其函数库的强大,更重要的是其操作语法的灵活性。随便找一本Matlab的编程入门书籍,肯定有这方面的介绍。其实矩阵操作的灵活性,强大到以至于我不敢看,日常只要掌握几个基本的操作就可以做很多事情了。特别在这里特别介绍一下,可以给你提高不少效率。
4.1.初始化序列
在编写各种算法的时候,经常要对矩阵初始化。例如前面提到的zeros,one,等等都是产生矩阵的方法,同样还有其他的产生对角矩阵等方法。这里特别要提到的是产生数据或者等差数列的方法。例如:
a = 1 : 2:10 ;%产生1-10的步长为2的等差数列,如果不写2会默认1;
4.2.初矩阵操作
在matlab中,数组或者叫做矩阵是可以任意扩充的,不需要其他,同样对矩阵的变化易如反掌,不需要那些for循环来进行。看看几个例子,管中窥豹,大家以此类推:
data = rand(4,4);%初始化1个4*4的随机矩阵,其值为0~1的随机数; a = data(:,1);%取data的所有行,第1列的数据,并赋值给a; b = data(:,[1,3]);%取所有行,第1,3列的数据,并赋值给b; c = data([2,3],[1,2]);%取第2,3行,第1,2列的数据,并赋值给c; d = data([1:3],2);%取第1到3行,第2列的数据,并赋值给d;
看下面的运行结果,比较直观:
当然这些是以double类型存储的,还有char类型等,cell,strcut等以后也会补充。<注:未完待续...>
4.3[]、{}、()区别:
[]是数组引用符号,一般为数字(double)或者单个字母(char),所以可以利用()调用某一行列的值
{}是元胞cell引用符号,一般存储为多字母(cell),元宝可以想象为超矩阵,每个元素可以是不同的类型和大小。可以利用{}调用某一行列的值;
%%double num = [1,2,3;3,2,1]; num(1,2) %%char zm = [\'a\',\'b\',\'c\';\'c\',\'b\',\'a\']; zm(1,2) %%cell dir = {\'Up\',\'Down\',\'Left\',\'Right\' }; dir{1,1}
4.4.二进制写入数据
如果有大量的数据(数字)要保存的话,一般常用save函数保存为.mat文件,但是若要保存为.txt文件怎么办?
这里可以利用fopen、fsprintf两个函数来进行保存操作:
1.fopen:
fid=fopen(\'PRBS_gen.txt\',\'w\');%matlab计算结果
2.fsprintf:
输出到文本或者显示屏,但是下面的函数将输出到文本.
for i=1:length(data) fprintf(fid,\'%d\',data(i));%保存数字 fprintf(fid,\'%c\',10);%保存字符 end
在matlab中,.m文件包含很多有Script和Function,简单来理解这两种文本,Script是没有输入和输出的,Function是有的,其他我倒没觉得有什么不同,嗯,就这么多吧。执行上来说,我觉的.m文件是相当于每行每行代码在Command Windows(5)按次序上跑一趟。
当然,代码比较长又需要保存,考虑写在.m文件中。但是如果其中有几句自己不太确定或者报错的代码,可以复制黏贴在Command Windows(5)上一条条输入(按Shift Enter换行)临时调试与测试,大致也就这些了吧。
5.1. .m或.fig文件的注意事项
1.matlab的变量名与.m文件命名和大小写很敏感一定要小心的啊,平时多用"_"下划线,尽量少用“ ”空格。
2.如果需要注释,可以添加“%"。matlab我还没发现可以像”/* */”注释多行的语句,这是个体力活,不过也挺好的。
如果需要显示效果突出分段效果(就是选中每大段代码成块有个底色),可以考虑添加”%%”。
3.每一行代码结束,如果不添加";“,就会在Command Windows(5)中显示计算过程与变量值。
4.变量无需自己定义,只需要写a=[];即可,同样初始化改变量也是直接这样写,数据类型会跟着变,简直牛掰啊。
5.matlab中数据类型有很多种,操作起来特烦人,最常用的是[\'a\' \'b\' str],一个框把所有的框起来,还有{}之类的。。
6.在matlab中,现在也支持面向对象编程,但我不会,使用Matlab暂时也只是用用函数,面向过程的编程啊。。。面向对象编程的使用如果大家有兴趣可以去找一下相关资料啊。matlab最常用的还是函数,和其他语言的方法类似。但是matlab的函数没有静态方法和实例方法之分,总的来说,都是静态的吧,直接调用。
编写函数使用的关键字是 function ,输入和输出参数可以是多个,例如 function [r1,r2,r3] = testfun(p1,p2,p3)
注意:一般来说函数是不可以直接被调用的,需要被另一个.m文件调用,并且根据这个函数的要求是有一定的输入的。当前该函数是要在Current Folder中的话,如果不是请自行指向该目录下。<注:未完待续...>
5.2. .m编程
1.matlab是支持for、if、while和switch以及sum等常用,但是不支持y++,--y之类的。
2.matlab可以执行矩阵运算的,这点很棒,如下:
N=1:1:10;%N是1到10的矩阵 y = power(2,N);%y=2^x,x=[1,10];
上述代码就相当于下面的代码:
for N =1:10 y(1,N) = power(2,N);%这一行代码一般是在其他平台是这样写的,个人这样觉得,可能有点绝对 end
3.有时候是需要利用和其他的函数一起用,例如下面提到的for、sun语句实现:
genotype_code=[6 10 11 7;7 10 10 7;6 6 11 11;6 11 11 7;7 10 10 6;7 11 11 7]; phenotype=[0;1;0;0;1;0]; f_num_0 = zeros(16,1); %统计类别0各属性取值 f_num_1 = zeros(16,1); %统计类别1各属性取值 for i = 1:6 for j = 1:16 f_num_0(j) = sum(genotype_code(:,i) == j & phenotype == 0);%****** f_num_1(j) = sum(genotype_code(:,i) == j & phenotype == 1);%****** end end
一个师兄写的,我这里精简了一些数据,这段代码当时惊呆了我,可以细细品味。
4.有时候运行数据可能是NaN类型的,代表不是一个数据。我这也遇到过,可以考虑isnan来判断下,嗯,代码见下:
Gini_i = Gini_i(~(isnan(Gini_i))
这里Gini_i数组里面可能存放着一些有用的数,也有NaN的数(比如进行log2()运算会有这种),上述代码是表示如果是NaN那么会将该值改为0,其他正常的数不变。详细可以参考isnan这个函数的用法。
5.有时候我们要找一个数组里的最大值max、最小值min或者是大于某阈值th的下标(就是第几行或第几列),详细可以参考find这个函数的用法,可以考虑:
Gini_max = max(Gini) ; %最大值 Gini_min = max(Gini) ; %最小值 Gini_index = find(Gini == min(Gini)) %找到最小值的下标 Gini_th = find(Gini >0.7) %Gini中大于0.7的所有值的下标
6.文件命名希望能够自己命名,但是又不希望写死,可以看看以下代码:
wavFileName = sprintf(\'%s.wav\', \'Right\'); wavPathName = sprintf(\'.\\%s\\%s\\%s\', \'src\',\'wav\', wavFileName);
可以看到我们可以把将wavFileName改变内容就可以重新命名的目的,”\\“为转义符。
<注:未完待续...>
5.3. .fig编程
matlab是可以做界面的,而且超极简单,很适合那些刚刚入门的盆友们。。。
1.在Command Windows(5)下输入>>guide 会弹出一个对话框,选择Create New GUI >> Blank GUI(Default),就会出现以下GUI。
在点击保存后会自动生成两个文件.fig和.m,.m是保存执行的代码,.fig是图像界面。
2.上述界面的一些介绍:1号区域是菜单栏,黄色的对齐功能特别适合对齐控件,绿色的三角形(蓝色圈住的)是运行按钮,点击后就会运行此gui界面。2号区域是控件栏,可以直接拖入3号区域(面板),双击打开Inspector(属性),可以设置,这个百度了解下每个属性功能就好,不细讲了,值得注意的是Tag的值,这是该控件的唯一标签(相当于人的身份证,可以通过这个找到这个控件的句柄)。3号区域是面板,理解为要运行后程序显示的那部分,右下角有个黑点,可以拖动来改变大小,也可以双击打开其属性,修改参数。
3.修改gui的图徽,默认是matlab的图徽,在.m文件中的function XXX_OpeningFcn(hobject,, eventdata, handles, varargin))下添加如下代码:
newIcon = javax.swing.ImageIcon(\'hui.jpg\'); figFrame = get(hObject,\'JavaFrame\');%hobject是指该fig的句柄 figFrame.setFigureIcon(newIcon);
4.在gui中显示图片,有一种做法是先在.fig中拉出axes控件,然后将图片显示在其上,网上代码很多。这里给出另外一种方法,在.m文件中添加以下代码:
axes(\'Parent\',gcf,... % 设置新的axe, 将\'parent\' 属性设置为当前窗口gcf \'Units\',\'pixels\',... %设置单位为pixels \'Position\',[0 0 64 64]); % 指定axe的位置,格式为[left bottom width height], left和bottom设定了axe的左下 %角坐标,width和height设定了窗口的宽度和高度 imshow(graphic_box,[0 64]);% axis equal; axis off %显示图像
注意一点:一般界面起始点坐标(0,0)在左上角,matlab起始点坐标(0,0)在左下角。
5.更新控件显示的数字啥的:
st = str2num(get(obj.text3,\'String\'));%获取text3上的字,并转为数字 st = st+1;%加1 set(obj.text3,\'String\',st);%显示新的字
6.调用了消息对话框,据我所知有三种方式调用消息框
a).windows dll插件(据说执行效率很高,我也不懂,那就先放在第一个好了):
asm = NET.addAssembly(\'System.Windows.Forms\'); import System.Windows.Forms.*; MessageBox.Show(\'Copyright hecongcong. Contact by [email protected].\',\'About\',MessageBoxButtons,MessageBoxIcon.Information);
b).matlab自带的消息框(简单,真的很简单,和a)差不多吧):
myicon = imread(\'landOcean.jpg\'); h=msgbox(\'Operation Completed\',\'Success\',\'custom\',myicon);
c).接下来最后一个也是我觉得最棒的一个,先把代码贴上:
h=dialog(\'name\',\'Training Direction\',\'position\',[700 400 300 60]); %obj = handles.text4; figFrame = get(h,\'JavaFrame\'); figFrame.setFigureIcon(newIcon); uicontrol(\'parent\',h,\'style\',... \'text\',\'position\',[1 35 100 20],\'string\',\'Please Choice:\'); uicontrol(\'parent\',h,\'style\',... \'pushbutton\',\'position\',[30 10 50 20],\'string\',\'Up\',\'callback\',\'MyTraining(1)\'); uicontrol(\'parent\',h,\'style\',... \'pushbutton\',\'position\',[100 10 50 20],\'string\',\'Down\',\'callback\',\'MyTraining(2)\'); uicontrol(\'parent\',h,\'style\',... \'pushbutton\',\'position\',[170 10 50 20],\'string\',\'Left\',\'callback\',\'MyTraining(3)\'); uicontrol(\'parent\',h,\'style\',... \'pushbutton\',\'position\',[240 10 50 20],\'string\',\'Right\',\'callback\',\'MyTraining(4)\');
newIcon是我在5.3.3中提到的图片,\'callback\'是回调函数,指向MyTraining(d).m这个函数文件,d是输入。(小提示:可以将\'pushbutton\'改为其他的控件名,如\'text\'等,看看效果。)
7.如何获取其他正在运行的.fig的句柄呢?先贴代码:
obj = guihandles(ProjectDigital_Main);%获取正在执行的ProjectDigital_Main.fig的句柄
st = str2num(get(obj.text3,\'String\'));%获取projectDigital_Main.fig的控件text3的字符串
<注:未完待续...>
请发表评论