简单记下在学习Matlab中遇到的坑
1.数学中的ln()函数在Matlab中表现为log()函数,即以e为底的对数
2.数学中的lg()函数在Matlab中表现为log10()函数,即以10为底的对数
3.e在Matlab中表现为exp()
4.类比 2^3 表示2的3次方,而exp(3)则表示为e的3次方,不需再要使用^
5.sqrt()在Matlab中表示平方根的意思
6.clc 清屏
7. clear 清除所有变量 小心使用
clear x 消除某个变量x
8.% 注释
9.Matlab 大小写区分
10.默认类型为double
11.format 控制命令窗口输出的数字格式
12.a = 10 与 a = 10; 的区别 一个及时显示结果,另一个不及时显示
13. who whos 用于查看变量
14. Matlab中矩阵用中括号表示 [ ] 而()表示对变量(矩阵)进行索引
15.向量是可以用矩阵的形式表示的,代数中讲过,只不过代数中所有向量不加箭头而已,勿忘
16. a = [1 2 3] 表示行矩阵 1*3
17. b = [2 ; 4 ; 6] 表示列矩阵 3*1
18. ;表示换行符
19.使用Matlab 必须使用西文字符,否则肯定会因为符号出错
20. 3*3 矩阵 A(4) = A(1,2)等等
21. 增广矩阵 F = [A B]
22.A()表示索引
23.A = [2:6] 表示递增,以1为增量
24.A = [2:2:10] 表示增量,以2为增量
25.矩阵的四则运算 区分* 与.*
26. *即普通的乘法运算
27. .* 即对应元素相乘相加 /类似
28. .^即表示对应元素乘方
29. A' 表示A矩阵转置
30. Matlab 是基于矩阵操作的,即以列矩阵为单位的
31. Matlab右键可以实行多行注释
32.%表示注释某行 %%表示实现区块 可以单独实现某个区块的run
33.Matlab可以实现调试功能,断点,单步调试,应有尽有,类似IAR
34.Matlab右键可以实现多行注释,多行取消注释,自动缩进,类似IAR
35. .m文件不同于.c文件,不会编译链接等
36.比较运算符 不等于 ~= 而不是和C中的 != 一样
37.选择语句 if/elseif/else/end 最大的区别是必须加end,if 和 elseif 或者 else 之间不加大括号{} 且if/elseif/else 不加小括号
38.switch/case/otherwise 相应的,关键词后面都不加小括号,两个关键词之间也不加大括号, 必须有end
39.输出函数,显示在命令窗口里面的函数调用,disp('Everything will be fine !!!'); 注意是单引号 disp(a); 输出a的值
40.科学计数法 1e100 表示 1乘10的100次方
41. for i = 1:100
Statement
end
42. tic
toc
用于计算这之间程序所用时间
43. close 关闭所有图形
44. 使用 ;可以不使结果立即显示在命令窗口里面,立即显示太占地方
45. Matlab中 ... 表示c中的接续符\
46.两变量相乘最好用 .* , 可以解决多组分别输入,分别输出的问题,而使用*则做不到
47.数字与变量相乘一般都是直接相乘
48.定义函数 function 输出 = 函数名 输入
49.function handle ->指针 不常用
50. Matlab中ctrl+c 用于中止进程,仅当正在进程执行过程中,其他条件下相当于复制
51.由于Matlab本来就是基于矩阵的,所以输入可以是多个数值,因此可以用【 】的形式,各个输入量用逗号隔开即可
52.disp(['The number is : ',num2str(123)]); 会输出 The number is : 123
需注意 1.多输入的时候必须要用[ ],表矩阵
2.中间用 ,连接
3.注意num2str()的用法
53.int8()/uint8()... 类似c中的强制类型转换,不会他们不是类型而是作为函数
54.Matlab中一个char包含2个字节 'a' 表示一个char类型 ‘abcde’ 表示一个字符串类型
55.[]用于拼接,当多个输入是可以使用[],Matlab会把其当做矩阵来处理,本来就是基于矩阵形式的
56. str = 'abcdadaa';
str == 'a'; %使用==会进行两个字符串一位一位比较
则str则会将'abcdadaa'中每一位与'a'进行比较,结果会输出一个1*8矩阵,而不是想当然的结果是0/1
57.如果需要将两个字符串整个比较则需要使用另一种方式 strcmp() 类似于c中的 == ,结果会输出0/1.
58.求一个字符串的长度应该使用length()函数而不是size() 函数
59.结构体直接使用即可,不需要定义,matlab本来就是普通变量都是不需要定义的,直接使用,强制类型转换是函数int8()等
60. student.name = ‘yohao’;
student.age = 18;
student.grade = [12 13 14; 15 16 17; 78 79 89];
需要哪个直接调用即可
61.fieldnames() 用于查看结构体中所有field
62.结构体创建有两种,一种即上述直接使用,另一种是使用struct(field,num),来定义,结构体里面可以嵌套结构体,
但我还是更倾向于第一种直接调用的方式
63.关于cell,声明有两种方式,A(1,1) = {'a'} / A{1,1} = 'Yohao' ,必须包含大括号
64.cell是类似于采取指针的形式
65.读取cell的值是采用{}而不是(),因此推荐第二种定义cell的方式,更习惯
66.reshape() 见名知意,重新排列变换形状
67.检查变量的指令 isxxxx 如 isempty / isstring
68.magic(3) 称为幻方矩阵 行和列和对角线和都是相等的,重点是可以自动生成一个3*3矩阵,一句话很方便
69.关于文件方面的说明
1. .m文件是matlab保存代码的文件 (代码文件)
2. .mat文件是matlab存储数据的数据文件 (数据文件)
3.储存文件用save指令
4.读取文件用load指令
70.读取excel 文件 xlsread()/xlswrite()
71.使用Matlab画图 Matlab画图功能很强大,Matlab不能直接画函数图形,如y=sin(x); 需要给数值点才可以画
72.画图函数 plot()
73.同时调用几个画图指令时,图形只会显示最后一个,因为前面都被refresh了,所以此时需要hold on/off指令,显示所有
74.当一张图中线段出现的过多时给图形添加图标,即右上角出现所有线段对应的名称,使用legend()指令
75.函数linspace(X1,X2,Y)用于均分X1->X2,可以不加Y,默认为100点,指定Y的话,就将X1->X2均分为Y点,
常用作画图X的范围
76.画图除了画出图形外,还要加上 xlabel/ylabel/title/legend
77.一些骚操作
xlabel('x = 0 to 2\pi'); 字符串中\pi显示π原型
legend('sin(x)','exp^{-x}'); 字符串中exp^{-x} 显示exp(-x)原型
78.Matlab画完图还可以加上数学公式标注,使用Latex功能,具体用到再说
79.Matlab还可以对图形的属性进行修改,一个图形由三部分组成,线段/axis/整个figure,每个部分都有唯一的id,线段id可以通过
h = plot(x,y) 得到,h则为线段id,其他两个都是默认id,分别是gca/gcf,通过指令get()/set()可分别得到/设置某个部分的属性
set(gca,'xlim',[0,2*pi]);
80. xlim/ylim 表示限制上下限
fontsize 字体大小
xtick 表示x轴的刻度线
xticklabel 表示x轴刻度线下的数字
linewidth 线宽
linestyle 线段的格式
color 颜色
上述均不区分大小写,即大小写效果都是一样的
81.delete表示删除线段或者图形
82.legend 可以选择放置位置 ,默认放置右上角,现在调整至左上角,方便显示
语法如下 legend('sin(x)','exp^{-x}','location','northwest'); location不可改
83. 这四个是一起的 xlabel/ylabel/legend/title
84.关于.*和*操作,新的理解(其他/和./ ^和.^都是类似)
举例 y=t^2;
.*是针对向量和矩阵的,入口参数是很多个,简单理解,多个输出分别与输入对应
而*操作输入只能是一个,如果是很多个的话会报错。
85.如果画多个figure,那么gca/gcf都是目前最新的,注意别搞错
86.如果想显示多张figure,使用指令
figure,plot(x,y);
figure,plot(x,z);
87.使用指令figure('position',[left,bottom,width,height]); 可以指定位置 position不可改
88.如果使多张figure分块显示在一张图片上的话,使用指令subplot(m,n,1); m*n即m行n列,最后一个数字表示第几个从左至右从上至下
89.三种指令
1.hold on/off
2.figure
3.subplot(1,1,1);
90.关于axis/grid显示/关闭指令
axis on/off;
grid on/off;
等等很多,使用help指令来查找
91.存储图片至文件
使用指令saveas()或者print(),使用help指令来查找
92.类似均分间隔函数linspace(x,y,n),对数图也有类似的均分间隔的函数logspace(x,y,n); 比较这两者,
linspace是将x到y区间进行n点的等分,后面n可以不加,默认为100点
logspace是将10的x次方到10的y次方进行n点等分,n可以不加,默认为50点
93.randn(2,100); 表示产生一个2*100的随机数矩阵,此函数用于随机数生成且有多种形式可以使用,具体使用时查看
94.histogram 表示直方图 histogram(x,100) 100表示100列,x表示随机数,直方图将呈正态分布,具体使用时查看
95.bar chart 表示柱状图,指令bar(x);将以柱状图的形式显示x的分布,具体使用时查看,bar3(x)表示三维柱状图
96.pie chart 表示饼状图,指令pie(x);将以饼状图的形式显示x的分布,具体使用时查看,pie3(x)表示三维饼状图
97.stairs chart表示阶梯图 stem chart 表示离散图,也就是采样过后的图,于是有指令stairs(y)/stem(y) 具体使用时查看
98.指令fill() 表示填充,通常用于填充某个闭区域,具体使用时查看
99.关闭axis 指令 axis square off /axis off 哪种适合就用哪种
100.指令text()用于在图像上面显示文字,可以设置文字的格式等,具体使用时查看
101.size与length的区别 size返回矩阵维数x*y,length返回长度,行或者列中最大的一个
102.zeros()表示全0,ones()表示全1
103.plot3(x,y,z,'r'); 画3D图形
104.axis square; 表示坐标轴以正方形形式出现
105.Matlab GUI学习 在命令窗口里面键入 guide 然后生成一个空白GUI即可进行图形化操作
106.文件->预设->GUIDE->勾选第一个选项 即可使左边工具栏显示对应的名称
107.在进行图形化操作的同时,必要的代码是少不了的,打开GUI对应的.m文件,不难看到首先是进行初始化,然而却
注释有 DO NOT EDIT,所以滑动到下面openingFunction/outputFunction/后面的各种CallBack都可以添加代码
只要能够满足要求即可
108.类似普通figure,此种GUI对应的不同部件也有不同的id,也称之为指针或者句柄,往往很多操作都需要使用其id,
一般形式为handles.xxx,如handles.output
109.如何查看id,双击图形界面中的任意一个Object,直接拖到Tag处,即可找到对应的id
110.GUI中每个CallBack下面变量都是有生存期的,离开了这个CallBack变量就会消失,因此GUI提供了一种全局变量
handles.myData = a; %a是你储存的临时变量 如果需要多个全局变量,myData名称可以改变
guidata(hObject,handles); %此指令是固定的
比如想要在其他地方使用a的值,直接令 b = handles.myData;即可
111.使GUI生成.exe文件,使用指令deploytool ,选择第一个application compiler,然后添加文件,最后选择package,
最后转换完成后,进入文件夹即可得到.exe文件
112.图像处理 0->黑色 / 255->白色 数字越大越亮
113.imread()用于读取一张图片 imshow()用于显示一张图片 具体用法使用时查看
114.Matlab有很多内置的图片可供直接调用,如 pout.tif/rice.png/cameraman.tif
115.imageinfo('pout.tif')用于查看图片的信息
116.imtool('pout.tif')图像处理小工具
117.immultiply()图片乘法,可使图片乘一个值变得更亮或者更暗,因为一个图片就是一个二维矩阵,常数乘以矩阵则矩阵中
所有数都乘以这个常数,数字越大越亮,即越接近白色,如果两个矩阵相乘,必须满足矩阵的运算性质
118.imadd()用于两个图片相加,条件是两个图片的矩阵必须是同型的 immultiply/imadd/imsubtract/individe -> +-*/
119.不难发现,几乎所有图像处理函数都是以im-开头的,-后面的才是真正名称
120.imhist()指令可以显示某张图片的频率和像素的关系,横轴是像素0-255,纵轴是频率 histgram->意思是直方图
121.调整图片的亮暗就是指使用一个数乘以图片对应的矩阵,以此达到亮暗的目的,使用指令immultiply()可以达到目的
122.指令histeq()是使图片更加均衡化,会使频谱分布更加均匀 可用于调整对比度 histgram equalization->意思是直方图均衡化
123.图片的几何变换 旋转/平移/切割等
124.interpolate v.插值 interpolation n.插值
125.指令imrotate()可用于将图片旋转至一定的角度,默认为逆时针,method中最好使用‘bilinear’,看起来不会变形
126.指令imwrite()可以将图片存为一定的格式,jpg/gif/tif等
127.threshold n.阈值
128.指令graythresh() 用于找出灰度图中像素的阈值,便于后续进行二值化 用法 bwValue = graythresh(i);
129.指令im2bw()用于将一个图片二值化,用法 即 j = im2bw(i,bwValue); 则j就称为i的二值化
130.指令im2bw在使用时,Matlab并不推荐,而是推荐使用imbinarize(),但是使用imbinarize好像存在Bug,可能是使用的对象不对
当我使用rice.png时imbinarize可以替换im2bw,但是换成lena.jpg时imbinarize就无法无法输出,还是使用im2bw吧
131.morphology n,形态学
132. bg = imopen(i,strel('disk',15)); 此操作可以得到灰度图的背景,但是却不知道是为什么
133.一种算法[labeled,num] = bwlabel(i,8);通过采取这种临近算法可以快速找米 啊哈哈 i为灰度图labeled为已经label的矩阵
num为数目 8则为采取8联通方式即8个方向
134.Matlab微分 polynomial n.多项式/adj.多项式的 coefficient n.系数
135.指令f = polyval(p,x);p是多项式系数矩阵,x是变量,必须为具体的变量,matlab不存在只输入公式即可实现画图这种情况
因此会发现所有画图的变量x都是取有限区间内的值,因此,确定系数矩阵即确定多项式,给定每个输入x必然有每个输出y
136.polyval()是多项式函数,此外polyder()是多项式微分函数,输入一个多项式系数,输出一个一次微分系数
137.polyint()表示对多项式积分 如 q = polyint(p,3); 输入是多项式系数和一个常数,因为不定积分后面要加c而为了计算
必须给确定值,此处3可为任意值,因此输出即为积分系数
138.指令diff()表示求一个向量中前后两元素的差值,后减前,可应用于微分定义计算 diff(sin(x0),sin(x0+h)) ./ diff(x0,x0+h)
当h足够小时即可实现微分运算 区分数值运算和多项式运算
139.数值积分,可以采用中位数法和辛普森法等,使连续积分离散化再求和
140.Matlab中有一种类似指针的东西,称为handle,比如gca/gcf,同样用户也可以自定义,如p=@sin();即p为sin的handle
141.函数integral(p,1,2);用于积分p是某个函数的handle,1/2 分别对应积分上下限
142.y = @(x) 1./(x.^3-2*x-5); 这是一种很常用的方式使用某个变量采取handle的方式替代整个复杂的式子进行计算,注意点运算
143.向量运算即对应.运算,矩阵运算对应普通的运算,.运算即对应多个输入分别有多个输出,
144.上面除了定积分integral外,还有二重/三重积分 integral2/integral3 用法和integral基本一致
1. 三个连续点...表示换行继续输入
2.format 可以更改显示格式 format short/long/loose/compact
3. help elfun 是一个函数集 如rem表示取模,sign表示符号
4.浮点数类型float/double 默认double
5.单引号 表示字符串 'p'/'123'/'abs' 都是对的
6.logical-> true/false
7.冒号:在矩阵中索引时表示所有的行或者是列,a(1,:)/a(:,1)
8.size返回行和列,length返回行或者列中的最大值 numel返回矩阵中所有元素的个数
9.end表示最后一列或者最后一行
10. input('Please input a number') / input('Please input a character : ','s') 分别用于输入一个数字/字符串
11.输出函数除了disp还有fprintf();用法同c中printf