一、数据类型
基本数值类型
1.不同细分类型的整型数之间不能直接运算;
2.整数只能与相同类的整数或标量双精度值组合使用。
1.浮点数包括单精度浮点数(single)和双精度浮点数(double);
2.realmax()、realmin()函数可以分别返回能表示的最大值、最小值;
3.class()函数返回输入参数的数据类型,没有预先声明的变量类型默认为double型。
a = realmax('double'),b = realmax('single')
a = realmin('double'),b = realmin('single')
class(pi)
class(3)
1.多个字符串可以形成矩阵,但每个字符串长度必须相等,不相等则可用空格补齐;
2.字符串常用函数。
逻辑型(logical)变量只能取true(1)或false(0),在访问矩阵元素时可以使用逻辑型变量取出符合某种条件的元素。
函数句柄可以方便函数名称的管理,也可以加快程序运行的速度。
原因:
将一个函数名称赋值给某函数句柄,则使用该函数名句柄时,关于该函数的信息已经载入工作空间中,系统不需要在每次调用时重新搜索一遍路径,而是在函数句柄包含的信息中直接找到函数的路径;另外。因为函数句柄包含了路径信息,在系统切换工作路径时,不需要将函数文件复制过来就可使用该函数。
函数句柄中包含的路径、函数句、类型及可能存在的重载方法等信息,可以用functions(function_handle)显示。
句柄的声明方法:
●直接使用@符号声明函数句柄,形式为:变量名 =@ 函数名
●用 str2func 函数,形式为:变量名 = str2func(‘函数名’)
●声明匿名函数句柄,形式为:变量名 =@ (输入参数列表)函数表达式
此处的函数可以是预定义函数,也可以是用户自定义的函数。声明函数句柄后,就可以像使用函数名一样使用该函数句柄。如声明 h =@ sin,就可以使用 h(pi)代替sin(pi)。
>> a = [1 4 7 9] %向量x
a =
1 4 7 9
>> h1 =@ sum %直接声明h1为sum函数的句柄
h1 =
@sum
>> functions(h1) %函数句柄h1包含的信息
ans =
function: 'sum'
type: 'simple'
file: ''
>> h2 = str2func('sum') %用srt2func函数声明h为sum函数的句柄
h2 =
@sum
>> functions
Error using functions
Not enough input arguments.
>> functions(h2) %函数句柄h2包含的信息
ans =
function: 'sum'
type: 'simple'
file: ''
>> sum(a) %使用sum求和
ans =
21
>> h1(a)
ans =
21
>> feval('sum',a)
ans =
21
>> feval(h2,a)
ans =
21
句柄中的函数为自定义函数:
>> h3 =@ fun1
h3 =
@fun1
>> functions(h3)
ans =
function: 'fun1'
type: 'simple'
file: ''
匿名句柄
>> h4= @(x,y)x^(-2) + y^(-2);
>> functions(h4)
ans =
function: '@(x,y)x^(-2)+y^(-2)'
type: 'anonymous'
file: ''
workspace: {[1x1 struct]}
Java对象(略)
>> version -java
ans =
Java 1.7.0_60-b19 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
变量
保留变量
特殊变量 | 取值 |
---|---|
ans | MATLAB中运行结果的默认变量 |
pi | 圆周率π |
eps | 计算机中的最小数 |
flops | 浮点运算数 |
inf | 无穷大,如1/0 |
NaN | 不定值,如0/0、∞/∞、0*∞ |
i或j | 复数中的虚数单位,i=j=√-1 |
nargin | 函数输入变量数目 |
narout | 函数输出变量数目 |
realmax | 最大的可用正实数 |
realmin | 最小的可用正实数 |
结构体与元胞数组
普通的矩阵只能包含同一种数据类型的数据,且矩阵的行、列必须对齐。结构体包含若干字段,字段的值可以是任意数据类型和任意维数的变量,也可以是另一个结构数组。元胞数组的元素也可以是任意数据类型、任意维度的数据。与矩阵不同,元胞数组引用元素时使用操作符“{}”,此时得到的数据的类型是元素本身的类型,而使用操作符"[]"引用元素时,得到的是一个小一些的元胞数组。元胞数组的内存空间是动态分配的,因此更加灵活,但运行效率欠佳。
元胞数组可以直接创建,也可以使用cell函数创建。结构类型数据的创建也可直接创建,或是利用struct函数创建。
创建元胞数组:
%利用单元索引创建一个2*2的元胞数组
>> A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
>> A(1,2) = {'Anne Smith'};
>> A(2,1) = {3 + 7i};
>> A(2,2) = {-pi: pi/4 :pi};
>> A
A =
[3x3 double] 'Anne Smith'
[3.0000 + 7.0000i] [1x9 double]
%利用内容索引创建元胞数组
>> A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
>> A(1,2) = {'Anne Smith'};
>> A{1,1} = [1 4 3; 0 5 8; 7 2 9];
>> A{1,2} = 'Anne Smith';
>> A
A =
[3x3 double] 'Anne Smith'
[3.0000 + 7.0000i] [1x9 double]
%利用cell函数创建元胞数组
>> a = cell(4)
a =
[] [] [] []
[] [] [] []
[] [] [] []
[] [] [] []
>> a = cell(3,4)
a =
[] [] [] []
[] [] [] []
[] [] [] []
创建结构体:
>> book.name = 'MATLAB'; %直接创建结构型数组
>> book.price = 25;
>> book.pubtime = '2013';
>> book
book =
name: 'MATLAB'
price: 25
pubtime: '2013'
>> book2 = struct('name','MATLAB','price',25,'pubtime','2013');
>> book2
book2 =
name: 'MATLAB'
price: 25
pubtime: '2013'
>> whos
Name Size Bytes Class Attributes
book 1x1 556 struct
book2 1x1 556 struct
字段完全相同的结构体常放在一起构成数组,成为结构数组。此时,可以用“[]”抽取出不同结构体的同一字段值,构成单独的数值数组。
for i = 1:10;
bookss(i).name = strcat('book', num2str(i));
books(i).price = 20 + i;
books(i).pubtime = '2013'
end
books =
price: 21
pubtime: '2013'
books =
1x2 struct array with fields:
price
pubtime
books =
1x3 struct array with fields:
price
pubtime
books =
1x4 struct array with fields:
price
pubtime
books =
1x5 struct array with fields:
price
pubtime
books =
1x6 struct array with fields:
price
pubtime
books =
1x7 struct array with fields:
price
pubtime
books =
1x8 struct array with fields:
price
pubtime
books =
1x9 struct array with fields:
price
pubtime
books =
1x10 struct array with fields:
price
pubtime
>> books(1)
ans =
price: 21
pubtime: '2013'
>> price = [books.price]
price =
21 22 23 24 25 26 27 28 29 30
结构数组相关函数
元胞数组相关函数
二、运算符
算数运算符、关系运算符、逻辑运算符(简单)
矩阵运算符和数组运算符(灵魂)
三、控制流
主要有6种,顺序结构、if-else-end分支结构、switch-case结构、try-catch结构、for循环结构和while循环结构。
1.顺序结构
顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的。顺序结构可以独立使用构成简单的完整程序,常见的输入、计算、输出三部曲的程序就是顺序结构。
【例1-1】计算圆的面积
clear all
%定义变量r,并赋值
r = 6;
%计算圆的面积
S = pi*r*r
%输出面积
fprintf('Area = %f\n',S)
S =
113.0973
Area = 113.097336
2.选择结构
MATLAB的选择结构与if语句和switch语句两种实现形式。if语句最为常用,switch语句则适用于选择分支比较整齐,分支较多,没有优先关系的场合。
if选择
1)最简if语句:
if expression
commands
end
如果判决条件expression为真,则执行命令组,否则跳过该命令组。
2)可供选择的执行命令组有两组:
if expression %判决条件
commands1 %判决条件为真,则执行命令组1,并结束此结构
else
commands2 %判决条件为真,则执行命令组1,并结束此结构
end
3)可供选择的执行命令组有n(n>2)组:
if expression1 %判决条件
commands1 %判决条件expresssion1为真,则执行commands1,并结束此结构
elseif expression2
commands2
%判决条件expresssion1为假,则expresssion2为真,执行commands2,并结束此结构
…
else
commandsn %前面所有判决条件均为假,则执行commandsn,并结束此结构
【例1-2】用色彩与线型区分数据点的范围
clear all
n = 100
x = 1:n
y = randn(1,n) %产生100个元素服从正态分布的随机行数组
hold on
for i = 1:n
if y(i) < -1
plot(x(i),y(i),'*m') %<-1的点用梅红色的*标出
elseif y(i) >= -1 & y(i) <= 1
plot(x(i),y(i),'ob') %在-1~1之间的点用蓝色的o标出
elseif y(i) >= 1
plot(x(i),y(i),'xr') %>1之间的点用红色的x标出
end
end
hold off
switch选择
switch语句执行基于变量或表达式值的语句组,关键字case和otherwise用于描述语句组,只执行第一个匹配的情形。如用到switch则必须用case与之搭配。
switch switch_expression %switch_expression为需要进行判决的标量或字符串
case case_expression1
statements1
%如果switch_expression等于case_expression1,则执行statements1,并结束此结构
case case_expression2
statements2
%如果switch_expression等于case_expression2,则执行statements2,并结束此结构
…
otherwise
ststementsn
%如果switch_expression不等于前面所有值,则执行statementsn,并结束此结构
end
说明:
1.switch-case结构的语法格式保证至少有一组指令组将会被执行;
2.switch-expression应为一个标量或字符串
【例1-3】以学生的成绩管理作为演示switch结构的应用,划分区域:满分(100)、优秀(90~ 99)、良好(80~ 89)、及格(60~79)、不及格(<60)。
clear all
for i = 1:10
a{i} = 89 + i
b{i} = 79 + i
c{i} = 69 + i
d{i} = 59 + i
end
c = [d,c]
Name = {'zhang','Lin','huang','chen','xu'} %元胞数组
Score = {78,92,89,40,100}
Rank = cell(1,5)
%创建一个含有5个元素的结构体数组S,它有三个域:Name、Score、Rank
S = struct('Name',Name,'Score',Score,'Rank',Rank)
%根据学生的分数,求出相应的等级
for i = 1:5
switch S(i).Score
case 100
S(i).Rank = '满分'
case a
S(i).Rank = '优秀'
case b
S(i).Rank = '良好'
case c
S(i).Rank = '不及格'
otherwise
S(i).Rank = '不及格'
end
end
%将学生的姓名、得分、登记等信息打印出来
disp(['学生姓名 ','得分 ','等级'])
for i = 1:5
disp([S(i).Name,blanks(6),num2str(S(i).Score),blanks(6),S(i).Rank])
end
学生姓名 得分 等级
zhang 78 不及格
Lin 92 优秀
huang 89 良好
chen 40 不及格
xu 100 满分
3.循环结构
for循环
for index = values
statements
end
说明:
for指令后面的变量x是循环变量,for与end之间的组命令statements是循环体。循环体被重复执行的次数是确定的,该次数由values数组的列数决定。
【例1-4】
clear all
theta = -pi:0.01:pi
r = [2 * sin(5 * theta).^2;cos(10 * theta).^3;sin(theta).^2;5 * cos(3.5 * theta).^3]
for k = 1:4
subplot(2,2,k) %拆分窗口为2*2窗口
polar(theta,r(k,:))* %绘制极坐标图
end
while循环
while循环在一个逻辑条件的控制下重复执行一组语句一个不定的次数。
while expression
statements
end
1.在while与end之间的命令组statements是循环体。MATLAB在运行while循环之前,首先检测expression的值,如果其逻辑值为真,则执行命令组statements;命令组statements第一次执行完毕后,继续检测expression的逻辑值,如果其逻辑值仍为真,则循环执行命令组statements,直到表达式expression的逻辑值为假时,结束while循环。
2.while循环和for循环的区别在于,while循环结构的循环体被执行的次数是不确定的,而for循环中循环体的被执行次数是确定的。
【1-5】利用while循环结构求方程x^3-2x-5的解。
clear all
a = 0; fa = -Inf
b = 3; fb = Inf
while b - a > eps * b
x = (a + b) / 2
fx = x ^ 3 - 2 * x - 5
if fx == 0
break
elseif sign(fx) == sign(fa)
a = x;fa = fx
else
b = x;fb = fx
end
end
disp('方程的解为:')
disp(x)
其他流程控制
1).break:break通常与if语句一起使用,用于在一定条件下跳出循环的执行。在有多重循环时,只能跳出break所在的最里层循环,无法跳出整个循环。
2).continue:continue用于结束本次for或while循环,紧接着程序开始执行下一次循环,并不跳出整个循环的执行。continue命令也常与if一起出现。continue与break的区别是,continue只结束本次循环,而break则跳出循环。
3).return:return命令可以直接结束程序的运行,并返回到上一层函数。
4).cho on/off:执行M文件时,显示/关闭显示文件中的命令。
5).pause:pause指令用于暂停程序,等待用户按任意键继续,pause(n)表示暂停n秒后继续执行。
4.错误控制结构
在程序设计中,有时候会遇到不能确定某段代码是否会出现运行错误的情况,这时候就可以用错误控制结构。MATLAB提供了try-catch结构用来捕获和处理错误。
try
statements1 %命令组1总是首先被执行,如果正确,则执行完后结束此结构
catch exception
statements2 %命令组1执行发生错误时,执行命令组2
end
说明:
1.命令组1发生错误时,才执行命令组2。try-catch结构只提供两个可供选择的命令组。
2.当执行statements1发生错误时,可调用lasterr函数查询出错的原因。如果函数lasterr的运行结果为空字符串,表示命令组1被成功执行了。
3.如果执行命令组2时又发生错误,MATLAB将会终止该结构。
【例1-6】编写代码,实现矩阵的矩阵转置、加和及两个矩阵的加和乘。
clear all
A = input('请输入矩阵A:')
B = input('请输入矩阵B:')
try
A',A + A,A + B,A * B
catch
disp('there is error:')
end
disp(lasterr)
四、M文件
在MATLAB命令行窗口中,输入命令系统就会马上执行,属于命令驱动模式。当命令较多时,采用命令驱动模式比较繁琐,不易保存和管理,此时就应使用MATLAB的M文件驱动模式。M文件扩展名为.m,是一种文本文件,可以用记事本打开,又分为脚本文件和函数文件。MATLAB的M文件编辑器提供了一个编辑、运行和调试程序的集成环境。创建M文件的方法如下:
1.在“文件”菜单下选择“新建”,再选择“脚本”或“子文件”,即可创建M脚本文件或M函数文件。
2.在工具栏中单击“新建”按钮,即新建了一个M脚本文件。
3.在命令行窗口输入edit并按回车,即新建了一个M脚本文件。edit后加文件名,可以新建指定文件名的M文件或打开已存在的M文件。
M脚本文件
M文件是一系列命令的集合,运行时,其中的变量保存于工作空间中。因此,它可以使用工作空间原有的变量。但反过来,不需要使用原有工作空间的变量时,这种机制可能会造成不可预知的错误。因此,规范的脚本文件往往以clear、close all等命令开头,以清除变量,关闭其他图形窗口。
执行方法:
1.工具栏运行
2.编辑窗口F5
3.命令行窗口输入脚本文件名按回车键
【例1-7】用M脚本文件对一组数据作线性回归,并绘图
clear all
x = [143 145 146 148 149 150 153 154 157 158 159 160 162 164]'
y = [11 13 14 15 16 18 20 21 22 25 26 28 29 31]'
x = [ones(length(x),1),x]
%线性回归
[b,bint,r,rint,stats] = regress(y,x)
%r2越接近1,F越大,p越小(<0.05),回归效果越显著
r2 = stats(1)
F = stats(2)
p = stats(3)
%绘制原始数据和拟合的直线
z = b(1) + b(2) * x
subplot(2,1,1)
plot(x,y,'o',x,z,'-')
%绘制残差图
subplot(2,1,2)
rcoplot(r,rint)
M函数文件
与主程序文件区别:
1.由function起头,后面跟的函数名必须与文件名相同;
2.有输入/输出变元(变量),可进行变量传递;
3.除非用global声明,否则程序中的变量均为局部变量,不保存在工作空间中。
通常函数文件由五部分构成:函数定义行、H1行、函数帮助文本、函数体、注释。
function [ output_args ] = Untitled2( input_args )
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
end
【例1-8】创建一个func.m函数,如果输入参数只有一个x,则返回x;如果输入参数有两个(x、y),则返回sqrt(x^2 + y^2)。
function b = func(x,y)
%距离函数
%假如nargin = 1,则返回x
%假如nargin = 2,则返回sqrt(x^2 + y^2)
if nargin == 1
b = x
else
b = sqrt(x^2 + y^2)
end
>> func([3,5]) %只有一个输入参数[3,5]
ans =
3 5
>> func(3,5) %两个输入参数3、5
ans =
5.8310
>> help func %使用help,显示注释内容
距离函数
假如nargin = 1,则返回x
假如nargin = 2,则返回sqrt(x^2 + y^2)
说明:
1.H1行:
在函数文件中,其第二行一般是注释行,这一行称为H1行,实际上它是帮助文本中的第一行。H1行不仅可以由“help函数文件名”命令显示,而且,lookfor命令只在H1行内搜索,因此这一行内容提供了这个函数的重要信息。
2.函数帮助文档:
这一部分内容是从H1行开始到第一个非“%”开头行结束的帮助文本,它用来比较详细地说明这一函数。当在MATLAB命令行窗口下执行“help函数文件名”时,可显示出H1行和函数帮助文本
3.函数体:
函数体是完成指定功能的语句实体,它可采用任何可用的MATLAB命令,包括MATLAB提供的函数和用户自己设计的M函数。
注意:
在函数文件中,除了函数定义行和函数体之外,其他部分都是可省的。但是作为一个函数,应加上H1行和函数帮助文本以提高函数的可用性;加上适当注释以提高函数可读性。