系列文章目录
第三章 matlab学习入门之编程基础
在这一章,你会学到的知识:
变量与语句;
程序控制;
M文件;
脚本;
函数;
变量检测;
程序调试;
文章目录
前言
对于数据分析与简单建模,matlab是非常简单的一个工具,要使用matlab去分析数据,则需要对matlab编程有一定的了解,如学习过其他编程语言,则会非常容易入手。
一、变量与语句
与许多编程语言类似,matlab也由变量来组成函数的语句,通过变量将数据存储起来,是一段可操作的内存,这一点是共通的,接下来就介绍在matlab中有哪些类型的变量。
1.1变量命名
与python类似,matlab不需要事先声明变量,使用时声明赋值即可。
还是和python类似,不能使用matlab关键字作为变量名。
1.2变量类型
和许多编程语言类似,matlab变量分为三类,局部变量,全局变量,永久变量。
1.局部变量,在该函数的工作区,
2.全局变量,在全部工作区,声明格式:global x_val;
3.永久变量,永久保存在内存,声明格式:persistent a;
1.3特殊变量
matlab定义了有默认含义的变量,
如:ans,保存运算结果的变量名;pi,圆周率;inf,无穷大;NaN不定数;
>> eps %机器零阈值,matlab中的最小数
ans =
2.2204e-16
>>
1.4关键字
与许多编程语言类似,matlab也有许多关键字,使用iskeyword命令可以查到这20个关键字,如下:
>> kws=reshape(iskeyword,5,4) %通过iskeyword返回20个关键字,通过reshape()函数,将20个关键字变成5,4的矩阵
kws =
'break' 'else' 'global' 'return'
'case' 'elseif' 'if' 'spmd'
'catch' 'end' 'otherwise' 'switch'
'classdef' 'for' 'parfor' 'try'
'continue' 'function' 'persistent' 'while'
>>
1.5matlab语句组成
可以是变量,函数,程序控制语句,
句终符号有分号;使用分号;时语句的输出被抑制,
每一句语句,后面应该加上注释,%xxxxxx;增加语句可读性;
二、程序控制
与许多编程语言类似,matlab语句也有控制结构,类似的,顺序结构语句,分支结构语句,循环结构语句;
2.1顺序结构
与许多编程语句类似,顺序语句是构成matlab语句的基本结构,安装先后顺序执行,如下:
>> a=1;b=2;c=a*b;
>> a,b,c
a =
1
b =
2
c =
2
>>
2.2分支结构
matlab中所谓分支结构就是许多编程语句里的条件语句结构,如if-else或switch-case这种,
2.2.1if-else-end结构
1.简单情况,需执行的指令只有一组,语法格式如下:
if expression %判断表达式真假
commands %若表达式为真,执行指令
end %执行结束
实例如下:
>> if 4>pi
magic(3)
end
ans =
8 1 6
3 5 7
4 9 2
>>
2.一般情况,需执行的指令只有两组,语法格式如下:
if expression %判断表达式真假
commands1 %若表达式为真,执行指令1
else
commands2 %若表达式为假,执行指令2
end %执行结束
实例如下:
>> if 3>pi
magic(3)
else
eye(3)
end
ans =
1 0 0
0 1 0
0 0 1
>>
3.复杂情况,需执行的指令只有多组,语法格式如下:
和c++类似的使用率elseif,拓展一下,在python中类似意思的关键字是elif,
if expression %判断表达式真假
commands1 %若表达式为真,执行指令1
elseif
commands2 %若表达式为假,执行指令2
else
commandsn
end %执行结束
实例如下:
>> if 2>pi
ones(4)
elseif 1>pi
eye(4)
else
magic(4)
end
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>>
2.2.2switch-case结构
和许多编程语言类似的结构,给出一个变量value,然后和表达式值进行对比,语法格式为:
switch value %value是需要比较的变量,变量可以是字符串或标量
case test1 %如果value等于test,执行指令
command1
case test2
command2
…
case testn
commandn
otherwise %如果value不等于前面所有test,执行commands指令
commands
实例如下:
>> cock=22;
>> switch cock
case 13
response='还可以小老弟'
case 10
response='小老弟得加把劲'
case 15
response='小老弟还凑合'
case 17
response='挺棒哦小老弟'
case 22
response='大公鸡欺负小猫咪'
otherwise
response='你是小猫咪?'
end
response =
大公鸡欺负小猫咪
>>
2.2.3try-catch结构
主要用在程序调试,平时写程序不能这样写,语法格式如下:
try
command1 %指令1被执行,若正确执行完,
catch
command2 %指令1发生错误,执行指令2,
注意:只有command1错误,才会执行指令2,当command1发生错误时,可用lasterr查询出错原因,若lasterr运行结果为空字符串,表明command1成功执行,
实例如下;
>> n=16;
>> matrix=magic(3) %构造一个3阶方阵
matrix =
8 1 6
3 5 7
4 9 2
>> try
mat_num=matrix(n) %取第n个数,当然取不到
catch
mat_end=matrix(end) %取最后一个数
reason=lasterr %返回try出错原因
end
mat_end =
2
reason =
索引超出矩阵维度。
>>
2.3循环结构
与许多编程语言类似,matlab中的循环也是for循环和while循环两种。
1.for循环
语法格式如下:
for x=array
commands
end
其中,循环次数由数组array决定,for循环内部用分号;抑制输出,
代码如下(示例):
>> for i=1:4
for j=1:4
if i>j %如果i>j,矩阵i行j列取值为π乘以i的平方
mat(i,j)=pi*i^2;
else %如果i<=j,矩阵i行j列取值为π乘以j的平方
mat(i,j)=pi*j^2;
end
end
end
>> mat %查看矩阵数据
mat =
3.1416 12.5664 28.2743 50.2655
12.5664 12.5664 28.2743 50.2655
28.2743 28.2743 28.2743 50.2655
50.2655 50.2655 50.2655 50.2655
>>
一个小例题,求1+3+5+…+1001的和,
思考一下,如何用刚学的matlab编程求解,
>> sum=0; %声明一个初始值0的标量
>> for i=1:2:1001 %初始化一个数组,步长为2,1,3,5,...,1001
sum=sum+i;
end
>> sum
sum =
251001
>>
2.while循环
while循环和for循环基本一样,不同之处在于while循环次数是不定的,直至条件为假,语法格式为:
while expression %判断逻辑值真假
commands
end
用while实现上面那个问题的求解。
代码如下(示例):
>> sum=0,i=1;
sum =
0
>> while i<=1001 %边界小于1001即可
sum=sum+i; %累加上i
i=i+2; %步长为2
end
>> sum
sum =
251001
>>
其他控制命令。
input(),等待用户输入数值,字符串,表达式等,按enter键输入到工作区,收回控制权,
value=input(‘message’)
value=input(‘message’,‘s’) %以字符串形式输入
>> message=input('message')
message55
message =
55
>>
pause %暂停执行,等待用户任意键继续
pause(n) %暂停n秒
continue %继续,跳过当前指令,继续循环
break %跳出循环
error(‘message’) %显示出错信息message,终止程序
warning(‘message’) %显示警告message,继续运行程序
三、M文件与脚本
M文件有函数和脚本两种类型,
可以通过文本编辑器来创建外部文本文件,
当处理复杂运算,使用M文件来编程,matlab提供了文本编辑器,
3.1M文件
一如何创建新的M文件呢?
有几种方法,
1.在matlab命令行窗口运行命令edit;
2.在matlab主页标签的文件File标签栏,选择新建New按钮,在右拉菜单中选择脚本script或者函数function。
编辑完成后,点击保存,给文件命名。
二如何打开创建好的M文件呢?
有几种方法,
1.在matlab命令行窗口运行命令edit filename;filename是已创建好的M文件名;
2.在matlab主页标签的文件File标签栏,选择打开open按钮,点击打开,选择要打开的M文件;
三如何保存创建好或者修改过的M文件呢?
在matlab主页标签的文件File标签栏,选择保存按钮;
可以使用what 指令查看用户定义的M文件,
M文件内容主要包括脚本script和函数function两种,是可以直接被matlab执行的文件,于matlab而言,是源文件。
3.2脚本
和普通程序类似,实例如下:
写一个M文件脚本
%this is a script example
syms x1 y1 x2 y2 x
x1=input('输入x1');
y1=input('输入y1');
x2=input('输入x2');
y2=input('输入y2');
if (1)
k=(y1-y2)/(x1-x2);
b=y1;
fprintf('y=%d*(x-%d)+ %d\n\n',k,x1,b);
end
脚本写好,保存后,可以在命令行窗口调用,输入脚本名即可,或者在文件夹选择脚本点击运行。
如下:
>> testscript
输入x11
输入y12
输入x23
输入y24
y=1*(x-1)+ 2
>>
四、函数
M文件名称和函数名称必须一致,
函数文件的第一行为function引导的函数声明行,改行列出所有输入输出变量名称,
>> mat=magic(3)
mat =
8 1 6
3 5 7
4 9 2
>> b=mean(mat)
b =
5 5 5
>>
子函数,在matlab中,
如下:
function [avg,med]=ee(x)
n=length(x); %得到输入数据长度
avg=myavg(x,n); %使用myavg()得到平均值
med=mymed(x,n); %使用mymed()得到中位数
end
function a=myavg(v,n)
a=sum(v)/n; %求数组之和,再除以数组长度
end
function m=mymed(v,n)
w=sort(v); %先对数组排序
if rem(n,2)==1 %n/2余数1,则+1除以2
m=w((n+1)/2); %使用索引得到数组中位数
else %n/2余数0,则除以2
m=w(n/2);
end
end
在命令行窗口调用ee函数,
>> [a,m]=ee([1 3 5 9 11])
a =
5.8000
m =
5
>>
内联函数
>> f=inline('3*x.^2')
f =
内联函数:
f(x) = 3*x.^2
>> f(pi)
ans =
29.6088
eval(),feval()函数
用于将函数和文本连接起来
1.eval()函数
将数值字符转换为双精度数值,
>> s='[1,2,3;4,5,6;7,8,9]'
s =
[1,2,3;4,5,6;7,8,9]
>> eval(s)
ans =
1 2 3
4 5 6
7 8 9
>> a=eval(s)
a =
1 2 3
4 5 6
7 8 9
>>
feval()函数
将字符串函数名,转换为能用的函数
>> s=@magic
s =
@magic
>> magic3=feval(s,3)
magic3 =
8 1 6
3 5 7
4 9 2
>> s1=@sin
s1 =
@sin
>> sin1=feval(s1,[pi,pi/2,pi/6])
sin1 =
0.0000 1.0000 0.5000
>>
函数编写建议
代码尽量向量化
>> x=1:2:10;
>> y=log(x);
>> y
y =
0 1.0986 1.6094 1.9459 2.1972
>>
预分配向量数组加快循环。
五、M文件变量检测
六、程序调试
七、程序调试
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。