笔记内容概述:本片笔记主要是出于学习读取matlab人脸识别的一个项目代码的需要,重新学习matlab基础知识代码需求;内部包括matlab基础语法以及一些我在实际操作中遇到的问题;

一、帮助

  1. 在命令行输入:demo、doc、唤醒帮助开发文档;
  2. 命令行输入:help 函数,获取函数相关的帮助信息;
  3. mathtape官网获取相关的学习内容,以及社区获取帮助;
  4. github。。。

二、变量

2.1 变量
  1. mat数据
  • 变量可以保存为mat数据;
  • 可以(按住ctrl)选中若干个啊数据打包为一个mat数据,以便下次 重新加载。训练数据。
  • 可以在文件中点击mat文件,将其中数据重新导入workspace;
  1. 读取图片会以矩阵形式读取,注意添加分号否则会显示大量矩阵学习。
  2. 默认类型double类型数据。
  3. 计算表达式自动产生一个ans变量。
  4. clear 变量名 从workspace清除指定变量。

  5. 行向量定义:
    一维:a=[1,2,3];

    1. 二维: 分号换行:a=[1,2,3; 4,5,6]<br /> 列向量: a= [1;2;3]<br /> 拷贝:b = a;<br /> 向量加法:a = a+1;向量中每个元素都要加一;
  6. 元组、小数组需要后续学习;

2.2 矩阵
  1. 矩阵判空:isempty();
  2. 全一矩阵:ones(n,m);创造n*m全一矩阵
  3. 全零矩阵:zeros(n,m);

2.3 索引操作:
  1. 矩阵索引从1开始;
  2. 取某行的全部列

image.png

  1. 获取第一行的1,3列元素

image.png

  1. 不知道维度时使用end

image.png

  1. 取某几列的全部行;
  • 可以以:代替全部行,以[3,4,5]来选中需要查看的列
  • 可以以3:5代表3到5列,等差数列。

image.png

  1. 矩阵的全部元素:列优先排列;所以a(n)对应按列优先排列对应的第n个数据。

image.png

2.4 矩阵合并:
  1. 矩阵按行合并 :把b添加作为a的的后面行 ( a ; b)

image.png

  1. 矩阵按列合并:( a , c)

image.png

2.5 sum函数操作
  1. 对矩阵按列求和;sum(a)

image.png

  1. 对矩阵按行求和

image.png

  1. 对矩阵全部元素求和 sum(a(:));

image.png

2.6 私有变量 注意向下的逻辑
  1. { }括号内可以存储多种变量;

image.png

  1. 套娃 :私有变量的内部{ }可以定义其他的变量;

image.png

  1. 细胞/元胞数组

image.png

  • cell 结构内部的子结构也是cell类型的。
  • cell( n)选中的时cell的子结构中的cell类型的数据结构
  • cell { n}是对cell内部的小的cell直接进行操作;注意报错以及正确的操作情况。
  • 注意ceil(n)函数(向上取整函数)做一定的区分。
  • 注意使用{ } 花括进行操作。

image.png
%细胞数组索引小括号()索引子ceil,花括号索引具体内容

三、运算符

  1. 不等于 ~=
  2. 点乘 .* 矩阵每一项对应做运算
  3. 点除 ./ 对应相除
  4. 点幂 a.^ b 对应 a中的元素为底对应以b中的元素为次数
  5. 点减、点加同上

四、流程控制语句

  1. for循环

    1. a = [1,2,3,4];
    2. %for循环中循环的区域的必须赋值;
    3. %disp是打印字符串的,num2str是将数字转换为字符;
    4. for a = [1,2,3]
    5. disp(num2str(a));
    6. end
  2. while

    1. a = 0;
    2. while a<2
    3. %注意没有+=赋值符号
    4. a = a + 1;
    5. end
  3. switch case

    1. a = 0;
    2. %注意一下格式
    3. switch a
    4. case 0
    5. disp(num2str(a));
    6. case 1
    7. disp(num2str(a));
    8. end
  4. if else ```matlab a = 0; if a == 0 disp(‘right’); %注意一下elseif是连在一起的 elseif a==1 disp(‘right’);
    else disp(‘right’);

  1. <a name="TaG4m"></a>
  2. ### <br />
  3. <a name="xMunt"></a>
  4. ### 五、函数
  5. 1. 格式 function 输出 = 函数名(形参) 函数体 end
  6. ```matlab
  7. function y = fun(x1 ,x2)
  8. a = 1;
  9. y = x1 + x2 + a ;
  10. end
  1. 调用函数时的多输出相关
    1. %获取两个输出值
    2. [x,val] = fminsearch(fun,0);
    3. %获取一个参数
    4. x = fminsearch(fun,0);
    5. %获取后一个参数
    6. [~,val] = fminsearch(fun,0);

六、画图

  1. 绘制图像 ```matlab x = 0:0.01:10; y = sin(x); plot(x,y); %plot([1,2,3],[4,5,6]); %设置相关参数 %设置线宽 plot(x,y,’lineWidth’,2); %设置线条颜色、样式以添加的标注,注意顺序; plot(x,y,’r-.o’);

hold on hold off %固定图像一面下一幅图像将原来的图像覆盖/清空。

  1. 2. 设置坐标
  2. ```matlab
  3. xlable('x');
  4. ylable('y');
  5. title('x-y');
  6. demo;

七、匿名函数

  1. %匿名函数
  2. %加不加空格无所谓;
  3. f1 = @(x) x= x +1;
  4. f2 = @(x,y) x+y;

注意:%表注释
%%。。。。。%%表示一个程序节

八、聚类-机器学习方法

  1. %随机数的配置;可重复
  2. rng default;
  3. %X中设置两组数据,第一组数据:1+0.75倍的随机数
  4. % 第二组数据:1+0.5倍的随机数
  5. %两组数据点更好区分,给后面的聚类工作量降低.
  6. X = [randn(100,2)*0.75+ones(100,2);
  7. randn(100, 2)*0.5-ones(100,2)];
  8. %打开一个新的图型窗口;
  9. figure;
  10. plot(X(:,1),X(:,2),'.');
  11. %标题为随机产生的数据;
  12. title 'Randomly Generated Data';
  13. %kmeans(参数样本,分成的类数)函数实现均值聚类;
  14. [idx,C] = kmeans(X, 2) ;
  15. %产生idxc的输出;idx中每个数据点的位置对应原来数据集中的数据点位置,
  16. %idx中的12表示哪一类。
  17. %聚类的输出c表示两个类的中心位置。
  18. figure;
  19. %逻辑索引
  20. %(X(idx==1, 1)表示第一列中的idx==1条件的数
  21. %注意性质标注时不要多加了空格否则无法识别设置的属性
  22. plot(X(idx==1, 1), X(idx==1,2),' r.','MarkerSize', 12)
  23. hold on
  24. plot (X(idx==2, 1), X(idx==2, 2),'b.','MarkerSize',12)
  25. %绘制出类中心
  26. %注意换行方法不过不是特别长就没必要换行了
  27. plot(C(:,1),C(:, 2),'kx',...
  28. 'MarkerSize',15,'LineWidth',3)
  29. %图例标注
  30. legend ('Cluster 1','Cluster 2' ,'Centroids','Location','NW' )
  31. title 'Cluster Assi gnments and Centroids'
  32. hold off

九、符号变量

  1. %定义符号变量
  2. syms x y z;
  3. %展开与简化
  4. f = (x+y)^2;
  5. expand(f);
  6. %会展开为x^2 + 2*x*y + y^2
  7. simplify(x^2 + 2*x*y + y^2);
  8. subs(f,x,z)
  9. %注意以上都是符号变量
  10. %以符号变量计算的ans也是符号变量不是double类型的数据
  11. %可以通过*1.0变为double数据。

十、梯度下降法(案例)

  1. %梯度下降法:随着多次得迭代,梯度随着自变量得负方向进行演变
  2. %梯度就是f函数得倒数(2*x+cosx))
  3. f = @(x) x^2+sin(x);
  4. %定义梯度下降法得初始值
  5. x0 = 0;
  6. y0 = f(x0);
  7. %alpha为变化因子2
  8. alpha = 0.1;
  9. val = [];
  10. for i = 1:30
  11. x0 =x0 -alpha*(2*x0+cos(x0));
  12. y0 = f(x0);
  13. val = [val,y0];
  14. end

十一、集合

集合得四种操作
image.png

  1. union([1,2],[3,4])
  2. ans =
  3. 1 2 3 4
  1. intersect([1,2,3],[2,3,4])
  2. ans =
  3. 2 3
  1. setxor([1,2,3],[2,3,4])
  2. ans =
  3. 1 4
  1. setdiff([1,2,3],[2,3,4])
  2. ans =
  3. 1

判别矩阵中是否有某个元素 返回ans为0或1;
image.png

十二、matlab中调用python

  1. 直接调用可用的python方法 ```matlab c = py.list([1,2,3]);

    c.append(4) c

c =

Python list (不带属性)。

  1. [1.0, 2.0, 3.0, 4.0]
  1. 2. 导入python的库;
  2. ```matlab
  3. a = py.numpy.array([1,2,3,4]);
  4. %matlab调用python的api

十三、结构体

  1. %结构体赋值的基本方法
  2. man.name = 'czf';
  3. >> man.name
  4. ans =
  5. czf
  6. %结构体对于同一个域赋予不同对象
  7. >> man(2).name = 'wjn'
  8. man =
  9. 1x2 struct array with fields:
  10. name
  11. >> man.name
  12. ans =
  13. czf
  14. ans =
  15. wjn
  16. %结构体查看有那些域的方法
  17. fields(man);
  18. %是否包含某个结构体
  19. isfieldman'age');
  20. %放入矩阵或者{}内;方便查看
  21. >> name = {man.name}
  22. name =
  23. 'czf' 'wjn'

十四、表格变量

  1. table函数

    1. age = [1,2,3];
    2. weight = [10,12,14,13];
    3. f = tableage,weight
  2. 表示形式

image.png

  1. 转置表示
    1. age = age';
    2. weight = weight';
    3. name = {'A';'B';'C'};
    4. f=table(name,age,weight)
    image.png
    或者如下表示
    image.png
  1. %获取某个属性对应的值
  2. f({'A'},:)
  3. %获取某个属性的全部内容
  4. f.age;

十五、线性回归(案例)

  1. %%
  2. load hald
  3. %注意以下数据的维度
  4. X =ingredients;
  5. y = heat;
  6. %%
  7. %%
  8. %fitlmmatlab机器学习的一个方法
  9. mdl = fitlm(X,y,'linear','RobustOpts','on');
  10. %%
  11. %plot在这里可以直接绘制模型。
  12. plot(mdl);

十六、向量化运算

  1. function y= fcn(x)
  2. if x<5
  3. y = 2*x;
  4. elseif x<10
  5. y = sqrt(x);
  6. elseif x<=20;
  7. y =x;
  8. end
  9. end
  1. y = 2*(x<5).*x+(x>5&x<10).*sqrt(x)+(x>=10&x<=20).*x;

采用向量化的即使算方法、使用加法把分段函数合在一起。

十七、向量函数bsxfun

可用于不同维度的向量之间的计算

  1. a = [1,2;3,4];
  2. b =[1,2];
  3. %向量维度不同
  4. %做加法;
  5. bsxfun(@add,a,b)
  6. %乘法
  7. bsxfun(@times,a,b)

repmat也可以实现不同维度向量的减法
a 操作 repmat(b,m,n);

十八、三维图

  1. x = 0:0.1:10;
  2. y = 0:0.1:10;
  3. z = x.^2+y.^2;
  4. %绘制三维曲线
  5. plot3(x,y,z);
  6. %绘制三维曲面surf mesh
  7. %注意一维向量是无法实现三维绘图的无法实现全部对应关系
  8. %复制为二维数组形成一种相关联的关系,并非一种简单转换。
  9. [xx,yy] =meshgrid(x,y);
  10. zz = xx.^2+yy.^2;
  11. mesh(xx,yy,zz);

十九、构建一个matalb神经网络

注意:机器学习时的数据集是以一行为一个样本;
不同于聚类时利用的样本为一列。
image.png
houseinputs有13个特征,506个样本。

  1. load house_dataset
  2. %获取数据
  3. %前500个样本作为训练集
  4. xtrain = houseInputs(:,1:500);
  5. ytrain = houseTargets(:,1:500);
  6. %后6个样本作为测试集
  7. xtest = houseInputs(:,501:506);
  8. ytest = houseTargets(:,501:506);
  9. %构建神经网络,[]中保存的时对应参数的神经元、以及对应的训练层数
  10. net= newff(xtrain,ytrain,[6,6,6]);
  11. %训练
  12. net = train(net,xtrain,ytrain);
  13. %预测
  14. net(xtest);
  15. %也可以把训练好的神经网络保存为.mat文件。

二十、oop面向对象

20.1 类的定义
  1. 弱类型;有的类型只局限于某个工具箱。
  2. 新建一个类;跟换类名、设置变量、设置函数 ```matlab classdef man %UNTITLED2 此处显示有关此类的摘要 % 此处显示详细说明

    properties

    1. age
    2. height

    end

    methods %同类名的构造方法

    1. function obj = man(myage,myheight)
    2. obj.age = myage;
    3. obj.height = myheight;
    4. end

    end

end

  1. ```matlab
  2. b.key = 1;
  3. >> b.name = 'name';
  4. >> b
  5. b =
  6. key: 1
  7. name: 'name'

面向对象的方法可以省略内存。结构体不能用点的方式调用函数,类可以点的方式调用方法。

20.2 类的继承
  1. classdef students < man
  2. % < 表示继承
  3. properties(Access = private)
  4. grade
  5. end
  6. methods
  7. function obj = student (age, height, grade)
  8. %@来调用父类的构造方法
  9. obj = obj@man(age, height);
  10. obj.grade = grade;
  11. end
  12. end

20.3 类的私有化
  1. %properties可以有多个,如下设置可以使得改properties内的数据外部不可见
  2. %SetAccess= private只能类内设置
  3. %GetAccess= private只能类内获取
  4. properties(Access = private)
  5. age
  6. end
  7. %通过类内方法来访问私有属性
  8. methods
  9. function show(obj)
  10. disp(obj.age);
  11. end
  12. end

20.4 类的重载

重新定义我们需要的类

二十一、GUI设计

21.1创建GUI

image.png
image.png
image.png
双击任一区域,可以进行相关设置;

21.2 回调函数

案例一:实现按键后数据在静态框内显示指定文本

  1. 首先我们需要先找到对应控件的命名;

image.png

  1. 通过贯穿全局的handles来调用其他内容,来完成按键时数据显示再静态文本框内。
    1. function pushbutton1_Callback(hObject, eventdata, handles)
    2. % hObject handle to pushbutton1 (see GCBO)
    3. % eventdata reserved - to be defined in a future version of MATLAB
    4. % handles structure with handles and user data (see GUIDATA)
    5. disp([hObject.String]);
    6. %handles可以理解为图像界面的所有信息.
    7. set(handles.text2,'String','训练完成')
    ```matlab %这个函数表示界面一经显示就会调用 function demo1_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to demo1 (see VARARGIN)

% Choose default command line output for demo1 handles.output = hObject;

disp([‘hello’]);

% Update handles structure guidata(hObject, handles);

% UIWAIT makes demo1 wait for user response (see UIRESUME) % uiwait(handles.figure1);

  1. **案例二:再静态文本框内显示按按键的次数;**
  2. 1. 编辑OpeningFcn
  3. handles.count = 0;定义一个全局变量<br />%把handles当前的数据保存到gcf当中;<br />guidata(gcf,handles);
  4. ```matlab
  5. function demo1_OpeningFcn(hObject, eventdata, handles, varargin)
  6. % This function has no output args, see OutputFcn.
  7. % hObject handle to figure
  8. % eventdata reserved - to be defined in a future version of MATLAB
  9. % handles structure with handles and user data (see GUIDATA)
  10. % varargin command line arguments to demo1 (see VARARGIN)
  11. % Choose default command line output for demo1
  12. handles.output = hObject;
  13. handles.count = 0;
  14. disp(['hello']);
  15. % Update handles structure
  16. guidata(hObject, handles);
  17. %gcf是图形的句柄;
  18. %把handles当前的数据保存到gcf当中;
  19. guidata(gcf,handles);
  1. 设置显示数据set(handles.text2,’String’,num2str(handles.count));

    1. 保存数据;
    1. function pushbutton1_Callback(hObject, eventdata, handles)
    2. % hObject handle to pushbutton1 (see GCBO)
    3. % eventdata reserved - to be defined in a future version of MATLAB
    4. % handles structure with handles and user data (see GUIDATA)
    5. handles.count = handles.count+1;
    6. %注意此处handles.count是过滤型变量,输出需要转换格式;
    7. %handles可以理解为图像界面的所有信息.
    8. %set(handles.text2,'String','训练完成')
    9. set(handles.text2,'String',num2str(handles.count));
    10. %注意对handles进行保存
    11. guidata(gcf,handles);

案例三;根据下拉菜单来显示图像

  1. function pushbutton1_Callback(hObject, eventdata, handles)
  2. % hObject handle to pushbutton1 (see GCBO)
  3. % eventdata reserved - to be defined in a future version of MATLAB
  4. % handles structure with handles and user data (see GUIDATA)
  5. %用str接受handles下的下拉菜单popupmenu1对应的所有字符
  6. str = handles.popupmenu1.String;
  7. %获取哪个值
  8. val = handles.popupmenu1.Value;
  9. %由于ezplot显示必须要显示函数句柄或者字符串类型
  10. %而val此时为cell类型所以要完成转换;
  11. fcn = str{val};
  12. ezplot(fcn);

image.png

案例四:

  1. function start_Callback(hObject, eventdata, handles)
  2. % hObject handle to start (see GCBO)
  3. % eventdata reserved - to be defined in a future version of MATLAB
  4. % handles structure with handles and user data (see GUIDATA)
  5. % --------------------------------------------------------------------
  6. function open_Callback(hObject, eventdata, handles)
  7. % hObject handle to open (see GCBO)
  8. % eventdata reserved - to be defined in a future version of MATLAB
  9. % handles structure with handles and user data (see GUIDATA)
  10. msgbox('你打开了')
  11. demo2;
  12. % --------------------------------------------------------------------
  13. function close_Callback(hObject, eventdata, handles)
  14. % hObject handle to close (see GCBO)
  15. % eventdata reserved - to be defined in a future version of MATLAB
  16. % handles structure with handles and user data (see GUIDATA)
  17. msgbox('你关闭了')
  18. %questdlg返回一个所选择的值,后面的属性按照顺序来选。
  19. r = questdlg('你要关闭吗?','关闭请求','是','否','否');
  20. %相对于r=='是'来做判断,strcmp更加规范一些。
  21. if strcmp(r,'是')
  22. close all;
  23. end

二十二、分类工具箱

  1. 导入数据;

image.png

  1. 选择我们需要的数据处理程序。

image.png

  1. 导入工作区的数据 +点击训练

image.png

二十三、全局变量

就相当于静态变量;

  1. %global可跨文件访问
  2. global x
  3. %persistent 是只能再本文件下访问,不可以跨文件访问;
  4. persistent y

二十四、异常检测

  1. try
  2. a = 1;
  3. catch ME
  4. if strcmp(ME,)
  5. assignin('base','ME',ME)
  6. end
  7. ----------------------------------------
  8. function trydemoll
  9. try
  10. a = [1,2,3];
  11. b = [1,2];
  12. c = a+b;
  13. catch Me
  14. if strcmp(Me.identifier, 'MATLAB: UndefinedFunction’)
  15. disp(Me. message);
  16. elseif strcmp (Me.identifier,'MATLAB: dimagree') ;
  17. warning(Me. message) ;
  18. end
  19. end

二十五、读取文件

  1. 对表格的读写操作; ```html %读操作 [data,str] = xlsread(‘demo11.xlsx’) %按照xlsx文件的列的相关信息来设置接受的数据的数值变量和字符串变量

%写操作 mydata = {小明’,22;’小红’,25}; %写入excl表格时有四个输入变量, %表格文件名+待写入数据+工作表的序号+再表格中的写入范围 xlswrite(‘demo11.xlsx’,mydata,1,’A5:B6’) ; [newdata,newstr] = xlsread(‘ emol1.xlsx’) ;

  1. 2. 对文本文档的读写操作
  2. ```html
  3. %读取文档
  4. file = fopen('demo12.txt','r');
  5. context = fscanf(file,'%s');
  6. fclose(file)
  7. %写入文档 a指的是追加w指的是重写
  8. file = fopen('demo12.txt','a');
  9. fprintf(file,'处处闻啼鸟');
  10. fclose(file)

变量作用域(变量空间)

  1. 涉及函数
  • assignin
  • evalin
  • persistent
  • global
  1. 全局变量(存在于全局区)
  • 函数内就是局部? workspace就是全局? ==global simulink m共享ws
  • 全局变量的清除方式
  • 等价于extern
  1. 静态变量
  • persistent
  • mlock(‘变量’) 可以使得变量不被清除 解除munlock(‘变量’)
  1. 跨空间变量调用和定义
  • 主函数和子函数同在一个空间?
  • ‘caller’与’base’:一个函数一个caller
  • assignin 与evalinI :

    assignin(‘base’,‘workerspace变量名’,传入变量名)

  • 村用变量与取用变量 ```html function ass_test d = 1; %将d存入worker space中 assignin(‘base’,’d’,d); %执行ass_test2将f数据存在assignin内。 ass_test2; disp(f); end

function ass_test2 f = 3; %通过caller把f放到assignin内。 assignin(‘caller’,’f’,f); end

```