笔记内容概述:本片笔记主要是出于学习读取matlab人脸识别的一个项目代码的需要,重新学习matlab基础知识代码需求;内部包括matlab基础语法以及一些我在实际操作中遇到的问题;
一、帮助
- 在命令行输入:demo、doc、唤醒帮助开发文档;
- 命令行输入:help 函数,获取函数相关的帮助信息;
- mathtape官网获取相关的学习内容,以及社区获取帮助;
- github。。。
二、变量
2.1 变量
- mat数据
- 变量可以保存为mat数据;
- 可以(按住ctrl)选中若干个啊数据打包为一个mat数据,以便下次 重新加载。训练数据。
- 可以在文件中点击mat文件,将其中数据重新导入workspace;
- 读取图片会以矩阵形式读取,注意添加分号否则会显示大量矩阵学习。
- 默认类型double类型数据。
- 计算表达式自动产生一个ans变量。
clear 变量名 从workspace清除指定变量。
行向量定义:
一维:a=[1,2,3];二维: 分号换行:a=[1,2,3; 4,5,6]<br /> 列向量: a= [1;2;3]<br /> 拷贝:b = a;<br /> 向量加法:a = a+1;向量中每个元素都要加一;
元组、小数组需要后续学习;
2.2 矩阵
- 矩阵判空:isempty();
- 全一矩阵:ones(n,m);创造n*m全一矩阵
- 全零矩阵:zeros(n,m);
2.3 索引操作:
- 矩阵索引从1开始;
- 取某行的全部列

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

- 不知道维度时使用end

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

- 矩阵的全部元素:列优先排列;所以a(n)对应按列优先排列对应的第n个数据。
2.4 矩阵合并:
- 矩阵按行合并 :把b添加作为a的的后面行 ( a ; b)

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

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

- 对矩阵按行求和

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

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

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

- 细胞/元胞数组

- cell 结构内部的子结构也是cell类型的。
- cell( n)选中的时cell的子结构中的cell类型的数据结构
- cell { n}是对cell内部的小的cell直接进行操作;注意报错以及正确的操作情况。
- 注意ceil(n)函数(向上取整函数)做一定的区分。
- 注意使用{ } 花括进行操作。
三、运算符
- 不等于 ~=
- 点乘 .* 矩阵每一项对应做运算
- 点除 ./ 对应相除
- 点幂 a.^ b 对应 a中的元素为底对应以b中的元素为次数
- 点减、点加同上
四、流程控制语句
for循环
a = [1,2,3,4];%for循环中循环的区域的必须赋值;%disp是打印字符串的,num2str是将数字转换为字符;for a = [1,2,3]disp(num2str(a));end
while
a = 0;while a<2%注意没有+=赋值符号a = a + 1;end
switch case
a = 0;%注意一下格式switch acase 0disp(num2str(a));case 1disp(num2str(a));end
if else ```matlab a = 0; if a == 0 disp(‘right’); %注意一下elseif是连在一起的 elseif a==1 disp(‘right’);
else disp(‘right’);
<a name="TaG4m"></a>### <br /><a name="xMunt"></a>### 五、函数1. 格式 function 输出 = 函数名(形参) 函数体 end```matlabfunction y = fun(x1 ,x2)a = 1;y = x1 + x2 + a ;end
- 调用函数时的多输出相关
%获取两个输出值[x,val] = fminsearch(fun,0);%获取一个参数x = fminsearch(fun,0);%获取后一个参数[~,val] = fminsearch(fun,0);
六、画图
- 绘制图像 ```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 %固定图像一面下一幅图像将原来的图像覆盖/清空。
2. 设置坐标```matlabxlable('x');ylable('y');title('x-y');demo;
七、匿名函数
%匿名函数%加不加空格无所谓;f1 = @(x) x= x +1;f2 = @(x,y) x+y;
八、聚类-机器学习方法
%随机数的配置;可重复rng default;%X中设置两组数据,第一组数据:1+0.75倍的随机数% 第二组数据:1+0.5倍的随机数%两组数据点更好区分,给后面的聚类工作量降低.X = [randn(100,2)*0.75+ones(100,2);randn(100, 2)*0.5-ones(100,2)];%打开一个新的图型窗口;figure;plot(X(:,1),X(:,2),'.');%标题为随机产生的数据;title 'Randomly Generated Data';%kmeans(参数样本,分成的类数)函数实现均值聚类;[idx,C] = kmeans(X, 2) ;%产生idx与c的输出;idx中每个数据点的位置对应原来数据集中的数据点位置,%idx中的1,2表示哪一类。%聚类的输出c表示两个类的中心位置。figure;%逻辑索引%(X(idx==1, 1)表示第一列中的idx==1条件的数%注意性质标注时不要多加了空格否则无法识别设置的属性plot(X(idx==1, 1), X(idx==1,2),' r.','MarkerSize', 12)hold onplot (X(idx==2, 1), X(idx==2, 2),'b.','MarkerSize',12)%绘制出类中心%注意换行方法不过不是特别长就没必要换行了plot(C(:,1),C(:, 2),'kx',...'MarkerSize',15,'LineWidth',3)%图例标注legend ('Cluster 1','Cluster 2' ,'Centroids','Location','NW' )title 'Cluster Assi gnments and Centroids'hold off
九、符号变量
%定义符号变量syms x y z;%展开与简化f = (x+y)^2;expand(f);%会展开为x^2 + 2*x*y + y^2simplify(x^2 + 2*x*y + y^2);subs(f,x,z)%注意以上都是符号变量%以符号变量计算的ans也是符号变量不是double类型的数据%可以通过*1.0变为double数据。
十、梯度下降法(案例)
%梯度下降法:随着多次得迭代,梯度随着自变量得负方向进行演变%梯度就是f函数得倒数(2*x+cos(x))f = @(x) x^2+sin(x);%定义梯度下降法得初始值x0 = 0;y0 = f(x0);%alpha为变化因子2alpha = 0.1;val = [];for i = 1:30x0 =x0 -alpha*(2*x0+cos(x0));y0 = f(x0);val = [val,y0];end
十一、集合
集合得四种操作
union([1,2],[3,4])ans =1 2 3 4
intersect([1,2,3],[2,3,4])ans =2 3
setxor([1,2,3],[2,3,4])ans =1 4
setdiff([1,2,3],[2,3,4])ans =1
判别矩阵中是否有某个元素 返回ans为0或1;
十二、matlab中调用python
- 直接调用可用的python方法
```matlab
c = py.list([1,2,3]);
c.append(4) c
c =
Python list (不带属性)。
[1.0, 2.0, 3.0, 4.0]
2. 导入python的库;```matlaba = py.numpy.array([1,2,3,4]);%matlab调用python的api
十三、结构体
%结构体赋值的基本方法man.name = 'czf';>> man.nameans =czf%结构体对于同一个域赋予不同对象>> man(2).name = 'wjn'man =1x2 struct array with fields:name>> man.nameans =czfans =wjn%结构体查看有那些域的方法fields(man);%是否包含某个结构体isfield(man,'age');%放入矩阵或者{}内;方便查看>> name = {man.name}name ='czf' 'wjn'
十四、表格变量
table函数
age = [1,2,3];weight = [10,12,14,13];f = table(age,weight)
表示形式

- 转置表示
age = age';weight = weight';name = {'A';'B';'C'};f=table(name,age,weight)

或者如下表示
%获取某个属性对应的值f({'A'},:)%获取某个属性的全部内容f.age;
十五、线性回归(案例)
%%load hald%注意以下数据的维度X =ingredients;y = heat;%%%%%fitlm是matlab机器学习的一个方法mdl = fitlm(X,y,'linear','RobustOpts','on');%%%plot在这里可以直接绘制模型。plot(mdl);
十六、向量化运算
function y= fcn(x)if x<5y = 2*x;elseif x<10y = sqrt(x);elseif x<=20;y =x;endend
y = 2*(x<5).*x+(x>5&x<10).*sqrt(x)+(x>=10&x<=20).*x;
采用向量化的即使算方法、使用加法把分段函数合在一起。
十七、向量函数bsxfun
可用于不同维度的向量之间的计算
a = [1,2;3,4];b =[1,2];%向量维度不同%做加法;bsxfun(@add,a,b)%乘法bsxfun(@times,a,b)
repmat也可以实现不同维度向量的减法
a 操作 repmat(b,m,n);
十八、三维图
x = 0:0.1:10;y = 0:0.1:10;z = x.^2+y.^2;%绘制三维曲线plot3(x,y,z);%绘制三维曲面surf mesh%注意一维向量是无法实现三维绘图的无法实现全部对应关系%复制为二维数组形成一种相关联的关系,并非一种简单转换。[xx,yy] =meshgrid(x,y);zz = xx.^2+yy.^2;mesh(xx,yy,zz);
十九、构建一个matalb神经网络
注意:机器学习时的数据集是以一行为一个样本;
不同于聚类时利用的样本为一列。
houseinputs有13个特征,506个样本。
load house_dataset%获取数据%前500个样本作为训练集xtrain = houseInputs(:,1:500);ytrain = houseTargets(:,1:500);%后6个样本作为测试集xtest = houseInputs(:,501:506);ytest = houseTargets(:,501:506);%构建神经网络,[]中保存的时对应参数的神经元、以及对应的训练层数net= newff(xtrain,ytrain,[6,6,6]);%训练net = train(net,xtrain,ytrain);%预测net(xtest);%也可以把训练好的神经网络保存为.mat文件。
二十、oop面向对象
20.1 类的定义
- 弱类型;有的类型只局限于某个工具箱。
新建一个类;跟换类名、设置变量、设置函数 ```matlab classdef man %UNTITLED2 此处显示有关此类的摘要 % 此处显示详细说明
properties
ageheight
end
methods %同类名的构造方法
function obj = man(myage,myheight)obj.age = myage;obj.height = myheight;end
end
end
```matlabb.key = 1;>> b.name = 'name';>> bb =key: 1name: 'name'
面向对象的方法可以省略内存。结构体不能用点的方式调用函数,类可以点的方式调用方法。
20.2 类的继承
classdef students < man% < 表示继承properties(Access = private)gradeendmethodsfunction obj = student (age, height, grade)%@来调用父类的构造方法obj = obj@man(age, height);obj.grade = grade;endend
20.3 类的私有化
%properties可以有多个,如下设置可以使得改properties内的数据外部不可见%SetAccess= private只能类内设置%GetAccess= private只能类内获取properties(Access = private)ageend%通过类内方法来访问私有属性methodsfunction show(obj)disp(obj.age);endend
20.4 类的重载
重新定义我们需要的类
二十一、GUI设计
21.1创建GUI



双击任一区域,可以进行相关设置;
21.2 回调函数
案例一:实现按键后数据在静态框内显示指定文本
- 首先我们需要先找到对应控件的命名;

- 通过贯穿全局的handles来调用其他内容,来完成按键时数据显示再静态文本框内。
```matlab %这个函数表示界面一经显示就会调用 function demo1_OpeningFcn(hObject, eventdata, handles, varargin)function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)disp([hObject.String]);%handles可以理解为图像界面的所有信息.set(handles.text2,'String','训练完成')
% 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. 编辑OpeningFcn:handles.count = 0;定义一个全局变量<br />%把handles当前的数据保存到gcf当中;<br />guidata(gcf,handles);```matlabfunction 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 demo1handles.output = hObject;handles.count = 0;disp(['hello']);% Update handles structureguidata(hObject, handles);%gcf是图形的句柄;%把handles当前的数据保存到gcf当中;guidata(gcf,handles);
设置显示数据set(handles.text2,’String’,num2str(handles.count));
保存数据;
function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)handles.count = handles.count+1;%注意此处handles.count是过滤型变量,输出需要转换格式;%handles可以理解为图像界面的所有信息.%set(handles.text2,'String','训练完成')set(handles.text2,'String',num2str(handles.count));%注意对handles进行保存guidata(gcf,handles);
案例三;根据下拉菜单来显示图像
function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%用str接受handles下的下拉菜单popupmenu1对应的所有字符str = handles.popupmenu1.String;%获取哪个值val = handles.popupmenu1.Value;%由于ezplot显示必须要显示函数句柄或者字符串类型%而val此时为cell类型所以要完成转换;fcn = str{val};ezplot(fcn);

案例四:
function start_Callback(hObject, eventdata, handles)% hObject handle to start (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% --------------------------------------------------------------------function open_Callback(hObject, eventdata, handles)% hObject handle to open (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)msgbox('你打开了')demo2;% --------------------------------------------------------------------function close_Callback(hObject, eventdata, handles)% hObject handle to close (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)msgbox('你关闭了')%questdlg返回一个所选择的值,后面的属性按照顺序来选。r = questdlg('你要关闭吗?','关闭请求','是','否','否');%相对于r=='是'来做判断,strcmp更加规范一些。if strcmp(r,'是')close all;end
二十二、分类工具箱
- 导入数据;

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

- 导入工作区的数据 +点击训练
二十三、全局变量
就相当于静态变量;
%global可跨文件访问global x%persistent 是只能再本文件下访问,不可以跨文件访问;persistent y
二十四、异常检测
trya = 1;catch MEif strcmp(ME,)assignin('base','ME',ME)end----------------------------------------function trydemolltrya = [1,2,3];b = [1,2];c = a+b;catch Meif strcmp(Me.identifier, 'MATLAB: UndefinedFunction’)disp(Me. message);elseif strcmp (Me.identifier,'MATLAB: dimagree') ;warning(Me. message) ;endend
二十五、读取文件
- 对表格的读写操作; ```html %读操作 [data,str] = xlsread(‘demo11.xlsx’) %按照xlsx文件的列的相关信息来设置接受的数据的数值变量和字符串变量
%写操作 mydata = {小明’,22;’小红’,25}; %写入excl表格时有四个输入变量, %表格文件名+待写入数据+工作表的序号+再表格中的写入范围 xlswrite(‘demo11.xlsx’,mydata,1,’A5:B6’) ; [newdata,newstr] = xlsread(‘ emol1.xlsx’) ;
2. 对文本文档的读写操作```html%读取文档file = fopen('demo12.txt','r');context = fscanf(file,'%s');fclose(file)%写入文档 a指的是追加w指的是重写file = fopen('demo12.txt','a');fprintf(file,'处处闻啼鸟');fclose(file)
变量作用域(变量空间)
- 涉及函数
- assignin
- evalin
- persistent
- global
- 全局变量(存在于全局区)
- 函数内就是局部? workspace就是全局? ==global simulink m共享ws
- 全局变量的清除方式
- 等价于extern
- 静态变量
- persistent
- mlock(‘变量’) 可以使得变量不被清除 解除munlock(‘变量’)
- 跨空间变量调用和定义
- 主函数和子函数同在一个空间?
- ‘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
```

