接触Matlab5年一个总结(Matlab要掌握的一些要点 )

时间:2024-03-28 18:33:08

 阅读目录

  1. 前言
  2. Matlab的开发环境与简单介绍
  3. Matlab的常见命令
  4. Matlab的灵魂-矩阵操作
  5. Matlab的.m或.fig的编程与技巧

 从大二开始接触到matlab,讲真,这是一个我觉得很良心的一个平台,之所以这样认为是因为matlab有个help功能,这里可以查询到所有的函数以及关键字的使用方法,但是可惜是英文版的,就比较难找到自己想要的函数功能,长时间里自己都是在百度里将自己所需要的函数功能说出,然后百度,一般都能找到,我觉得很有用的一个matlab论坛平台是MATLAB中文论坛,这里有很多大牛,也欢迎大家去膜拜学习。这是我的第一篇博客,也是我人生中的一个新起点,刚过去一个灰色的大四,人生没有回头路,我只愿未来越来越美好。

  我很感激博客园,在这里我学到了很多知识。

  这篇博客是参考了另一位博客园作者大牛:数据之巅,http://www.cnblogs.com/asxinyu/p/Basic_Matlab_Experience.html。

1.前言

  本文不是给完全没有过一定编程经验的人准备的。至少了解或看过过一些C编程什么的。

 本文的范围很大,信息很多。由于本人在接下来研究生生活中将在Matlab下生存一年半多,本文将随时随地的更新,在这里,我会补填上很多,可能简单可能复杂吧,个人觉得就Matlab而言,其实没多复杂的东西,很多都可以自行百度的。

  我的开发环境为windows10,Matlab2013b,我觉得系统和Matlab版本对学习影响不大,毕竟大家用的基本上都是2012以上的,所以版本影响不大。尤其是版本不是越高越好,适合自己的就好,说到底稳定能跑的动就行。

  <注:未完待续...>

2.Matlab开发环境和简单介绍

  如何安装matlab,请自行百度,太多了。下图为Matlab2013b的界面

接触Matlab5年一个总结(Matlab要掌握的一些要点 )

   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。 

3.Matlab的常见命令

   经常使用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矩阵操作的语法,太灵活了 ,掌握几个基本的就可以完成很多工作了。

  <注:未完待续...>

4.Matlab的灵魂-矩阵操作

   前面已经提到Matlab最重要的一点强大的数值计算功能,不仅体现其函数库的强大,更重要的是其操作语法的灵活性。随便找一本Matlab的编程入门书籍,肯定有这方面的介绍。其实矩阵操作的灵活性,强大到以至于我不敢看,日常只要掌握几个基本的操作就可以做很多事情了。特别在这里特别介绍一下,可以给你提高不少效率。

4.1.初始化序列

   在编写各种算法的时候,经常要对矩阵初始化。例如前面提到的zeros,one,等等都是产生矩阵的方法,同样还有其他的产生对角矩阵等方法。这里特别要提到的是产生数据或者等差数列的方法。例如:

a =  : : ;%产生1-10的步长为2的等差数列,如果不写2会默认1;

4.2.初矩阵操作

   在matlab中,数组或者叫做矩阵是可以任意扩充的,不需要其他,同样对矩阵的变化易如反掌,不需要那些for循环来进行。看看几个例子,管中窥豹,大家以此类推:

data = rand(,);%初始化1个4*4的随机矩阵,其值为0~1的随机数;
a = data(:,);%取data的所有行,第1列的数据,并赋值给a;
b = data(:,[,]);%取所有行,第1,3列的数据,并赋值给b;
c = data([,],[,]);%取第2,3行,第1,2列的数据,并赋值给c;
d = data([:],);%取第1到3行,第2列的数据,并赋值给d;

看下面的运行结果,比较直观:

接触Matlab5年一个总结(Matlab要掌握的一些要点 )

当然这些是以double类型存储的,还有char类型等,cell,strcut等以后也会补充。<注:未完待续...>

4.3[]、{}、()区别:

[]是数组引用符号,一般为数字(double)或者单个字母(char),所以可以利用()调用某一行列的值

{}是元胞cell引用符号,一般存储为多字母(cell),元宝可以想象为超矩阵,每个元素可以是不同的类型和大小。可以利用{}调用某一行列的值;

%%double
num = [,,;,,];
num(,) %%char
zm = ['a','b','c';'c','b','a'];
zm(,) %%cell
dir = {'Up','Down','Left','Right' };
dir{,}

  

4.4.二进制写入数据

如果有大量的数据(数字)要保存的话,一般常用save函数保存为.mat文件,但是若要保存为.txt文件怎么办?

这里可以利用fopen、fsprintf两个函数来进行保存操作:

1.fopen:

FID= fopen(filename,permission)%用指定的方式(permission)打开文件(filename)
注1.:FID=+N(N是正整数):表示文件打开成功,文件代号是N.FID=-1: 表示文件打开不成功。
注2.:filename为文件路径,建议使用相对路径,不易出错。
注3.:perimission打开方式参数由以下字符串确定:
    'r'     读出
    'w' 写入(文件若不存在,自动创建)
    'a' 后续写入(文件若不存在,自动创建)
    'r+' 读出和写入(文件应已存在)
    'w+' 重新刷新写入,(文件若不存在,自动创建) ...
例如:
fid=fopen('PRBS_gen.txt','w');%matlab计算结果 

2.fsprintf: 

 输出到文本或者显示屏,但是下面的函数将输出到文本.

for i=1:length(data)
fprintf(fid,'%d',data(i));%保存数字
fprintf(fid,'%c',10);%保存字符
end

5. .m或.fig文件编程与技巧

   在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是支持forifwhileswitch以及sum等常用,但是不支持y++,--y之类的。

  2.matlab可以执行矩阵运算的,这点很棒,如下:

N=::;%N是1到10的矩阵
y = power(,N);%y=^x,x=[,];

  上述代码就相当于下面的代码:

for N =:
y(1,N) = power(,N);%这一行代码一般是在其他平台是这样写的,个人这样觉得,可能有点绝对
end

  3.有时候是需要利用和其他的函数一起用,例如下面提到的for、sun语句实现:

genotype_code=[   ;   ;    ;   ;   ;   ];

phenotype=[;;;;;];

   f_num_0 = zeros(,);      %统计类别0各属性取值
f_num_1 = zeros(,); %统计类别1各属性取值
for i = :
for j = :
f_num_0(j) = sum(genotype_code(:,i) == j & phenotype == );%******
f_num_1(j) = sum(genotype_code(:,i) == j & phenotype == );%******
  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

接触Matlab5年一个总结(Matlab要掌握的一些要点 )

  在点击保存后会自动生成两个文件.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',[ ]); % 指定axe的位置,格式为[left bottom width height], left和bottom设定了axe的左下 %角坐标,width和height设定了窗口的宽度和高度
imshow(graphic_box,[ ]);% axis equal; axis off %显示图像

  注意一点:一般界面起始点坐标(0,0)在左上角,matlab起始点坐标(0,0)在左下角。

  5.更新控件显示的数字啥的:

         st = str2num(get(obj.text3,'String'));%获取text3上的字,并转为数字
st = st+;%加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 h18818217356@live.com.Thanks.','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',[   ]);
%obj = handles.text4;
figFrame = get(h,'JavaFrame');
figFrame.setFigureIcon(newIcon);
uicontrol('parent',h,'style',...
'text','position',[ ],'string','Please Choice:');
uicontrol('parent',h,'style',...
'pushbutton','position',[ ],'string','Up','callback','MyTraining(1)');
uicontrol('parent',h,'style',...
'pushbutton','position',[ ],'string','Down','callback','MyTraining(2)');
uicontrol('parent',h,'style',...
'pushbutton','position',[ ],'string','Left','callback','MyTraining(3)');
uicontrol('parent',h,'style',...
'pushbutton','position',[ ],'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的字符串

<注:未完待续...>