第三章 matlab学习入门之编程基础

系列文章目录

第三章 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提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN-JackZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值