002 MATLAB语言基础
01 变量命名规则
- 变量名只能由字母、数字和下划线组成,且必须以字母开头;
变量名区分字母的大小写;
变量名不能超过最大长度限制;
关键字不能作为变量名,如for、end和if等;
注意:存变量命名时应尽量避开MATLAB中预定义变量。
1.MATLAB预定义变量:
2. 变量赋值:
赋值语句的一般形式为:变量=数据(或表达式)
>>a=1,b=2,c=a^2+3*b+1 %命令间用逗号间隔,回车后命令窗口显示为:
a=1
b=2
c=8
>>a=1;b=2; c=a^2+3*b+1 %前两条语句加上分号,回车后命令窗口显示为:
c=8 %加了分号的语句的运行结果不再显示在命令窗口中
>>a %但可以通过直接输入变量名查看变量的取值
a=1
>>a=4
a=4 %当变量再次被赋值时,新值代替旧值
3.标点符号及其作用:
02 向量及其运算
1向量的生成
向量就是一维的数组
-
直接输入法:
生成行向量的格式: -
向量名=[a1,a2,a3,…]
生成列向量的格式:
向量名=[a1;a2;a3;…] 或对行向量取转置:向量名=[a1,a2,a3,…]’
-
冒号表达式法:
一般格式为:向量名=a1:step:a2在a1和a2之间取值,其中a1为向量的第一个元素,step为变化步长,省略时,默认为1。
a=[1:2:10],b=[1:5]
a =
1 3 5 7 9
%注意:也就是说用冒号表达式法生成向量时,最后一个元素不一定是a2
b =
1 2 3 4 5
-
组合法:
一个向量和数值或另一向量(同为行或列向量)组合在一起,构成一个新的向量
a=[1 2 3 4];b=[10 11];c=[a 13 b zeros(1,2)]
-
利用linspace函数生成向量法:
linspace(a,b,n):产生首尾元素分别为a和b,数量长度为n的等差行向量。当n省略时,默认n=100。
linspace(2,50,25)
2向量的运算
- 同维向量的加减 : 对应位相加减
- 数与向量的加减、乘除 :对应位相乘除
- 向量的点积:
点积运算函数dot(A,B) :同维向量A和B各对应位置上元素相乘后的和,其结果是一个标量。 - *向量的叉积*
- *向量的混合积*
>>a=[1 2 3];b=4:6;c=linspace(7,10,4);
>>d=a+b, e=a-c
d =
5 7 9
??? Error using ==> minus
Matrix dimensions must agree. % 表明e=a-c运算中a与c的维数不同,使运算出错
>>f=a+1,g=b-1
f =
2 3 4
g =
3 4 5
>> h=3*a,k=4*b'
h =
3 6 9
k =
16
20
24
>> dot(a,b)%点积运算函数
ans =
32
03 数组及其运算
1 数组的创建
直接输入法:
A=[1 2 3 4;5,6,7,8],B=[1 2+i 3i 4],C=[9:12;1:2:5 21],D=A+i*C
整个数组放在“[ ]”内;数组元素以逗号或空格隔开;行与行之间用分号或回车键隔开;行内元素也可采用冒号表达式法生成。 如果数组中的元素都是复数,也可以先产生实部数组和虚部数组,然后再将实部数组加上虚数单位与虚部数组的乘积,得到复数数组。
函数法:
2 数组的寻址
找出需要被操作的元素。对数组A寻址的指令如下:
- A(r,c):表示数组A的第r行第c列的元素。
- A(r,:):表示数组A的第r行元素。
- A(:,c):表示数组A的第c列的元素。
- A(s):把数组A的所有列按先左后右的次序,首尾连接成一个序列后,由上到下的第s个元素。(MATLAB是按照列的先后顺序存放的。)
例子:
% 数组的寻址
>>a=randn(3,4),b=a(1,3),c=a(2,:),d= (a(:,3))',e=a(10)
a =
-1.3362 -0.6918 -1.5937 -0.3999
0.7143 0.8580 -1.4410 0.6900
1.6236 1.2540 0.5711 0.8156
b =
-1.5937
c =
0.7143 0.8580 -1.4410 0.6900
d=
-1.5937 -1.4410 0.5711
e =
-0.3999
3 数组的代数运算
主要包括: (都是对数组内的每一个元素操作)
A=[1 2 3;4 5 6];B=[1 3 4;2 5 6];
加(+)、减(-)、 对应位相加减
乘(.*)、 E=A.*B
除(./和.\)、 E=A.*B
幂运算(.^)、 H=A.^2
指数运算(exp)、 I=exp(A) =e^A
对数运算(log) J=log(A)
开方运算(sqrt) K=sqrt(A)
……
点乘(.*) :点乘是针对数组元素的运算,要求两个数组的维数必须相同
而乘(*):是矩阵乘法,遵循线性代数的规则。它要求第一个矩阵的列数必须与第二个矩阵的行数相同。
4 数组的关系运算
是按元素来比较相同规格数组(行、列数相同)或比较数组与标量
关系运算符的运算法则为:
- (1) 当两个标量VS时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0。
- (2) 同维数组VS时,比较是对应位置的元素按标量关系运算规则逐个进行,并给出元素比较结果为0或1组成的与原矩阵相同的同维数组。
- (3)标量VS数组时,则把标量与数组的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果为0或1组成的与原矩阵相同的同维数组。
数组的逻辑运算
>>A=[1 0 0;2 3 4];B=[0 1 3;0 1 2];C=A&B,D=or(A,B),E=~(A)
C =
0 0 0
0 1 1
D =
1 1 1
1 1 1
E =
0 1 1
0 0 0
5 数组的逻辑运算
注意:在算术、关系、逻辑运算中,算术运算优先级最高,逻辑运算优先级最低。
数组的逻辑运算
>>A=[1 0 0;2 3 4];B=[0 1 3;0 1 2];C=A&B,D=or(A,B),E=~(A)
C =
0 0 0
0 1 1
D =
1 1 1
1 1 1
E =
0 1 1
0 0 0
04 矩阵及其运算
创建方法与二维数组创建方法一样
1 函数法:
2 矩阵的运算
- 矩阵的加、减:相同行数和列数的两矩阵对应元素间进行加减运算 矩阵的乘法
- 矩阵的除法 左除A\B=inv(A)*B,是线性方程Ax=B的解; 右除B/A=B*inv(A),是线性方程xA=B的解。
- 矩阵的乘方和开方 乘方利用符号“^”实现,开方利用函数sqrtm实现
- 矩阵的指数和对数 指数运算用函数expm实现,对数运算用函数logm实现
矩阵的特殊运算
数学函数
三角函数:
sin 正弦
asin 反正弦
cos 余弦
acos 反余弦
tan 正切
atan 反正切
cot 余切
acot 反余切
sec 正割
asec 反正割
csc 余割
acsc 反余割
取整函数 :
ceil 取整
floor 取整
fix 向0取整
round 四舍五入为整数
sign 符号函数
复数函数 :
abs 绝对值和复数模
angle 复数的相角
real 复数的实部
imag 复数的虚部
conj 求共轭复数
complex 构造复数
isreal 判断实数
指数函数 :
exp 以e为底的指数
log 自然对数
log2 以2为底的对数
log10 以10为底的对数
pow2 2的幂
sqrt 平方根
求余函数 :
mod 模除求余
rem 求余数
其它 :
lem 求最小公倍数
ged 求最大公约数
05 函数与表达式
函数——系统内部函数和用户自定义函数
表达式(按照优先级的先后顺序执行;如果优先级相同,要按先左后右的顺序执行。)运算符的优先顺序:
06 MATLAB数据类型
数值型 整数符号: 有符号整数(int) 无符号整数(unit)。 浮点数: 单精度浮点数(float) 双精度浮点数(double)。 默认的数据类型是双精度浮点数。
与数值型数据类型有关的函数
函数 功能 语法
who 显示当前工作空间中所有内存变量的名称 who
whos 显示变量的维数、字节数和数据类型 whos 变量名
class 显示变量的数据类型 class (变量名)
isinteger 验证变量是否为整数,结果返回1或0 isinteger(变量)
intmax 查询不同整型所能表示的最大整数 intmax('整型数据类型名')
intmin 查询不同整型所能表示的最小整数 intmin('整型数据类型名')
isnumeric 验证变量是否为数值型 isnumeric(变量)
double 将数据转换成双精度浮点型 double(变量)
single 将数据转换成单精度浮点型 single(变量)
isfloat 验证变量是否为浮点型 isfloat(变量)
isa 验证输入变量是否为指定的数据类型 isa(变量,‘数据类型’)
realmax 查询单精度和双精度所能表示的最大浮点数 realmax('double'或'single')
realmin 查询单精度和双精度所能表示的最小浮点数 realmin('double'或'single')
函数size(x) 可以查询变量x的尺寸;
函数length(x) 相当于max(size(x)),返回各维中维数最大的数值;
函数ndims(x) 返回变量的维数,相当于length(size(x));
函数nnz(x) 返回x中非零元素的个数;
函数nonzeros(x) 返回一个由x的非零元素构成的列向量,即length(nonzeros(x))=nnz(x)
%其中x可以各种类型量
应用:
例: 查询变量的尺寸
>> size(randn(2,3)) %返回随机矩阵的尺寸
ans =
2 3
>> [a,b]=size(randn(1,3)) %将随机矩阵的行值赋给变量a,列值赋给变量b
a =
1
b =
3
>> size(randn(3,4),1) %返回指定维上随机矩阵的尺寸
ans =
3
>> length(randn(3,4)) %返回随机矩阵各维中最大的值
ans =
4
>> ndims(randn(3,4)) %返回随机矩阵的维数
ans =
2
>> A=[1 2 0 1;0 -1 0 2]
>> nnz(A) %返回A中非零元素的个数
ans =
5
>> nonzeros(A) %返回A中的非零元素
ans =
1
2
-1
1
2
与函数逻辑有关函数:
logical: 将其它类型数组转换成逻辑类型数组,其中非零元素为真,零元素为假;
true: 产生指定维数的逻辑真值数组;
false: 产生指定维数的逻辑假值数组。
islogical:判别数据是否是逻辑型的。
应用:
例:逻辑型数据的有关运算
>>A=randint(2,3),B=logical(A),C=true(size(A)),D=false(2,3)
A =
1 1 1
0 0 1
B =
1 1 1
0 0 1
C =
1 1 1
1 1 1
D =
0 0 0
0 0 0
>>a=true,b=flase,c=islogical(A),d=islogical(B)
结果显示a=1,b=0,c=0,d=1
>>whos B
Name Size Bytes Class
B 2x3 6 logical array
Grand total is 6 elements using 6 bytes
可见逻辑型数组的每一元素占用1个字节
07 字符串
例: 生成字符串
>>str1='Heibei University',str2=['of',' ','Science',' ','and',' ','T','e','c','h','n','o','l','o','g','y']
%直接输入法
str1 =
Heibei University
str2 =
of Science and Technology
>> str=[str1,' ',str2] %组合法
Heibei University of Science and Technology
>>str3='Don''t you?' %字符串中有单引号
若字符串中存在单引号,需要在输入字符串内容时,连续输入两个单引号
str3 =
Don’t you?
>>str4=['a':2:'z'] %冒号表达式法
str4 =
acegikmoqsuwy
>>str5=char('MATLAB','基础','与应用') %函数法
str5 =
MATLAB
基础
与应用
查询字符串的长度:
函数size:以向量的形式返回各维的维数和长度;
函数length:返回长度。
字符串的对齐操作:
水平合并:
str1=['he','bei'];===等同===str2=strcat('shijia','zhuang');
垂直合并:
str3=['information';'world '];~=str4=strvcat('communication','engineering');
前者必须长度,故用空格补齐
字符串操作函数:
函数 功能
ischar 判别变量是否是字符型
blanks(n) 返回包含有n个空格的字符串
deblank(str) 删除字符串尾部的空格
findstr(str1,str2) 在str1中查找str2
lower(str) 转换成小写
upper(str) 转换成大写
strcmp(str1,str2) 比较str1和str2,相等返回1,不等返回0
strrep(str1,str2,str3) 用str3替代str1中所有的str2
strcmpi(str1,str2) 忽略大小写比较str1和str2
strncmpi(str1,str2,n) 比较str1和str2的前n个字符
strmatch(str1,str2) 从str2的各行中查询以str1开头的行号
strjust(str,’style’) str按style(取left、right或center)进行左对齐、右对齐或居中
strtok(str) 返回str中第一个分隔符(空格、回车或tab键)前的部分
字符串与数值数组的转换函数:
函数 功能 用法
abs 字符串转换成ASCII码 abs(字符串)
double 字符串转换成ASCII码 double(字符串)
char 通过ASCII码把任意类型数据转换成字符串 char(数据量)
num2str 将非整数数组转换成字符串 num2str(数值数组,有效数位)
int2str 将整数数组转换成字符串 int2str(整数数组)
mat2str 将数值数组转换成字符行向量 mat2str(数值数组,有效数位)
str2num 将字符数组转换成数值数据 str2num(字符数组)
以下期末一般不考
09 细胞数组
细胞数组的基本元素是细胞(cell),每个细胞可以存储不同类型、不同维数的数据
细胞数组的创建
用花括号{ }直接赋值生成细胞数组 :
>>a={'his score','MATLAB',90,['笔试45';'上机45']}
a =
'his score' 'MATLAB' [90] [2x4 char]
函数cell创建细胞数组 ,调用格式为:cell(m,n)
>>a=cell(2);a{1,1}='class1';a{1,2}='no0823101';a{2,1}='name mary'; a{2,2}=['English... 85';'Computer 90']
a =
'class 1' 'no 0823101'
'name mary' [2x11 char]
细胞数组的其它操作:
函数 功能
celldisp(c) 显示细胞数组c的内容
cellplot(c) 显示细胞数组c的结构图
iscell(c) 查询c是否是细胞数组
iscellstr(c) 查询c是否是字符型细胞数组
cellfun 应用于细胞数组中的各个细胞元素
cellstr(s) 用字符数组s的的行向量作为细胞构成细胞数组
char(c) 细胞数组c中的细胞作为行向量构成字符数组
mat2cell(A,m,n) 将普通数组A按照指定的m和n参数转换成细胞数组
cell2mat(c) 将细胞数组c转换成普通数组
num2cell(A,dim) 将数组数组A按照指定维方向dim(1是行、2是行、3是页,并且3种方向还可以组合
起来,如[1,2],dim缺省时,把数组的每一元素都转化成细胞数组的一个细胞)转
换成细胞数组
cellplot(A) %显示细胞数组A的结构图
10 结构数组
结构数组的构建
直接法:
%创建上表所示的student结构
>> student.number='0901001';
>> student.name='李丽';
>> student.sex='女';
>> student.age='19';
>> student.class='01';
>> student.department='09';
>> student
student =
number: '0901001'
name: '李丽'
sex: '女'
age: '19'
class: '01'
department: '09'
函数法(struct函数):
student=struct(‘number’,‘0901001’,‘name’,‘李丽’,‘sex’,‘女’,‘age’,‘19’,‘class’,‘01’,…
'department',... '09')
student1 =
number: '0901001'
name: '李丽'
sex: '女'
age: '19'
class: '01'
department: '09'
注意:如果域没有值,创建时一定要赋空值;多个元素域值相同时,可以赋值一次
结构数组的访问
student1.number %访问结构数组所有元素的指定域
ans = 0901001
student1(2).score %访问结构数组中指定元素的指定域
ans = 19.3431 30.2764 15.0873 37.8373 85.3655 68.2223 54.1674 69.7898 86.0012 59.3563
student1(2).score(2,2) %访问数组中指定元素的指定域的指定下标的域值
ans = 54.1674
结构数组域操作:
获得结构数组中的域名
>> fieldnames(student1)
ans =
'number'
'name'
'sex'
'age'
'class'
'score'
删除结构数组中的域
student1=rmfield(student1,{'sex','age'})
student1 =
1x2 struct array with fields:
number
name
class
score
结构数组的其它操作函数
setfield: 设置域值, 调用格式:struct_name=setfield(struct_name,
{i,j},’field_name’, {m,n},field_value)
getfield: 获取域值, 调用格式:getfield(struct_name,
{i,j},’field_name’,{m,n})
orderfields: 将域名按字母顺序排序, 调用格式:orderfields(struct_name)
isstruct: 判断数据对象是否是结构类型。 调用格式:isstruct(struct_name)
isfield: 判断字符串是否是给定结构的域名。 调用格式:isfield(struct,’field_name’)
struct2cell: 结构数组转换成细胞数组。 调用格式:cell_name=struct2cell(struct_name)
cell2struct: 细胞数组转换成结构数组。 调用格式: struct_name=
cell2struct(cell_name,fields,dim)