MATLAB基本操作
创建数组
基于方括号创建
此时要注意的是,同行元素用“空格或者逗号”分割,不同行元素用分号“;”或者换行分隔。
x=[1 2 3 ] %行向量
x=[1 3;4 5;7 8]%矩阵
冒号创建行向量
基本格式:
起始:步长:终点
特别的:a:b相当于a:1:b
x=1:5
x=1:2:9 %[1 3 5 7 9]
x=10:-2:1 %[10 8 6 4 2]
函数创建
- linespace(a,b,n) 含义是将区间[a,b]用n个数均匀等分成n-1份
例如
x=linespace(0,10,5) %x=[0 2.5 5 7.5 10]
- 空矩阵 a=[]
- rand(a,b)产生a行b列的随机矩阵
- zeros(m,n)产生m行n列的零矩阵
- ones(m,n)产生m行n列的全为1矩阵
- eye(m,n)产生m行n列单位阵
基于数组的拼接
- [A B] 横向拼接 要求A,B行数相同
- [A;B] 纵向拼接 要求A,B列数相同
数组数据提取
访问数组使用圆括号
x(i) %访问x第i个元素
x(a:b:c) %相当于从第a个元素开始 到第c个元素,均匀的访问5个元素
x(i,j) %访问第i行j列元素
x(r,:) %获取第r行
x(:,c) %获取第c列
x(行下标集,列下标集) %获取对应子阵
x(:) %将数组排成列向量
数组数据的相互赋值
确保赋值语句左右维数相同
如:
A(i,:)=B(k,:) %讲B的第k行赋值给A的第i行
A([1 2],:)=V %将矩阵V赋值给A的1 2 行
%用空矩阵复制可以起到删除的作用
A(i1:i2,:)=[];
A(:,j1:j2)=[];
end的使用用法:end再下标表达式当中表示最后一个下标值
1.如果end出现在一个向量的下标中,则表示向量的元素个数(最后一个元素)
2.如果end出现在一个矩阵的行下标位置,则表示矩阵的行数
3.如果end出现在一个矩阵的列下标位置,则表示矩阵的列数
例如:
A=rand(1,10)
A(end)%取第十个元素
相关运算
算术运算符
对象 | 运算符 |
---|---|
矩阵 | + - * / \ ^ ’ |
数组 | .* ./ .\ .^ |
标量 | + - * / ^ \ |
\ /的区别是左除与右除的区别
点乘,点除等运算是矩阵对应位置元素进行对应操作
矩阵乘除遵循矩阵乘法法则
’ 指的是矩阵的转置
关系运算符
符号 | 名称 |
---|---|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 等于 |
~= | 不等于 |
逻辑运算符
逻辑运算符是逻辑logic数据 0假1真
符号 | 名称 |
---|---|
与 | & |
或 | 竖线(打不出来) |
非 | ~ |
数据类型
常用数据类型 double char sym struct cell
当然还有很多其他的不常用数据类型,例如 tree 。
使用whos+变量名 命令
使用class+变量名命令
不过最常使用的还是看内存窗口来看变量类型以及占用内存情况
cell数据类型
%%创建一个cell
A=cell(m,n);%创建了m行n列的cell
%%提取数据采用大括号
A{i};
A{i,j};
例如:
>>a=cell(2,3)
a=
[] [] []
[] [] []
>>a[1,1]='abc' ; a[1,2]=rand(3);a(1,3)=cell(1,2);
>>a
a=
'abc' [3×3 double] [1×2 cell]
[] [] []
cell与数组最大的不同就是cell中可以含有不同数据类型的元素,这就极大简化了数据的存储
IO操作
三个IO函数
input 输入函数
disp 显示数组内容函数
sprintf 将数组内容格式化字符串进行显示
input(提示信息字符数组)
g=input('please input your grade');%引号内为提示信息,输入信息赋值给g
%%input 可以有两个参数
g=input('what is your name','s');%'s'表示g是一个字符数组。其余参数可以使用help查询文档
disp(变量名)
disp用于展示变量名中的内容不输出变量名,例如
>>a=[1 2 3 4 5];
>>disp(a)
1 2 3 4 5
>> a
a=
1 2 3 4 5
格式输出函数sprintf
str=sprintf(formatSpec,A1,A2,······An)
将A1······An按照formatSpec格式化为字符串赋值给str
%d %f %c %s 与C语言中的格式含义相同
%5d中的数字表示字符串的长度
常用函数
sum
- sum(v) 求向量v中各个元素的和
- sum(A,1) 求矩阵A中每列的和,将每列和构成一个行向量返回
- sum(A,2) 求矩阵A中每行的和,将每行和构成一个列向量返回
注意 sum(A)相当于sum(A,1)
mean
- mean(v) 求向量v中元素的平均值
- mean(A,1) 求矩阵A中每列的平均值,将每列平均值构成一个行向量返回
- mean(A,2) 求矩阵A中每行的平均值,将每行平均值构成一个列向量返回
注意 mean(A)相当于mean(A,1)
max min
[V,I]=max(x)
- x为向量,则v为向量中的最大元素;I为最大元素在x中的下标
- x为矩阵,则v为每列最大元素组成的行向量,I则为每列最大元素行下标组成的向量。
[V,I]=min(x)
- x为向量,则v为向量中的最小元素;I为最小元素在x中的下标
- x为矩阵,则v为每列最小元素组成的行向量,I则为每列最小元素行下标组成的向量。
length size
length(x)
- 如果x为向量,则返回x的元素个数
- 如果x为矩阵,则返回矩阵行数与列数中较大的
size(x)
- 如果x为向量,矩阵则返回由行数,列数组成的向量,返回的第一个元素为行数,第二个元素为列数
sort
[B,I]=sort(v)
对向量v中的元素排序,B为递增排序v后的元素,I为排序后数组B的元素在原数组V中位置下标
sort中引入第二个参数
sort(v,‘ascend’)%升序
sort(v,‘descend’)%降序
find
find用于查找数组中非零元素的位置
find结合逻辑运算,可以查找所需元素的下标
>>a=[1 2 3 4 5 6 7];
>>idx=find(a>=3)
idx=
3 4 5 6 7
注意 idx只是下标,要获取相应元素值需要代码 values=a(idx)
fix 取整函数
结构化编程
分支结构
if
用法:
%一个分支
if 逻辑表达式
语句块
end
%两个及更多的分支
if 逻辑表达式1
语句块1
elseif 逻辑表达式2
语句块2
elseif ·····
······
else
语句块
end
注意,逻辑表达式1 逻辑表达式2 逻辑表达式3······依次判定
若语句块n+1执行,则必须有逻辑表达式1····n全部为0。
elseif 与else if二者含义完全不同,前者在一个判断内,后者为重新写了一个if
前者结尾需要一个end 后者需要两个end
switch
switch switch_expr %设定分支变量,对switch_expr进行分支讨论
case case_expr
语句块1
case case_expr0
语句块2
case {case_expr1,case_expr2,······}%使用花括号
语句块3
otherwise,
语句块4
end
分支变量一般为标量或者字符串
循环结构
for循环结构
语法:
for x=array
语句块
end
在for和end之间的 语句块 an数组(array)中的每一列执行一次,在每一次迭代中,x被指定为数组的下一列 也就是说,在第n次循环中
x=array(:,n)
常用格式:
for 变量=初始值:步长:终值
语句块
end
%x是行向量
for i=1:length(x)
%循环体
end
for i=x
%循环体
end
%上述两个循环结构执行次数相同,但是i的赋值不一定相同
while循环结构
语法:
while 逻辑表达式
循环语句块
end
当逻辑表达式中的所有元素为真,就执行循环语句块
i=1;
while i<=50
disp(sprintf('interation %d',i))
i=i+1;
end
当两个元素类型一致是可以使用数组拼接进行连接
两个元素类型不一致时使用sprinf进行格式字符串拼接
控制语句
continue break
continue break常常用于for while 循环语句中,与if语句一起使用
continue 跳过本次循环,进行下一次循环
break 跳出循环,接着执行之后的语句
for x=array
语句块1
if 逻辑表达式1,
continue,
end
语句块2
end
for x=array
语句块1
if 逻辑表达式1,
break,
end
语句块2
end
模块化编程
程
序
文
件
{
脚
本
文
件
函
数
文
件
程序文件\left\{ \begin{aligned} 脚本文件 \\ 函数文件 \end{aligned} \right.
程序文件{脚本文件函数文件
程序文件储存格式:纯文本文件–Matlab程序编译器,记事本,写字板编辑
脚本文件
- 脚本程序变量在脚本执行完之后任然保留在工作空间中,并且可以被其他脚本文件调用。直到用clear将变量空间清除
- 脚本程序可以调用系统空间中的变量
调用方式:
- 直接输入文件名,不加扩展名
- 在文件中调用
······
myprog
······
- 在编译器中按F5键运行
函数文件
- 与脚本文件两点一致
- 需要设置函数的输入参数,输出参数
函数的编写规范:
- 有输入参数,输出参数,并且完成一定功能
- 变量命名规范
- 必须以字母开头
- 区分大小写
- 由字母数字下划线组成
函数语法
%函数第一行为 function [输出参数列表] = 函数名(输入参数列表)
%参数由逗号分隔
function[r1,r2,r3,r4] = MyFunc(a1,a2,a3,a4)
%标明4个输入参数,3个输出参数
%函数文件名与定义的函数名一般情况下要一致,否则,调用文件名作为函数名
%函数名要有实际意义,避免与内部函数冲突,通过help检查是否为系统函数
%若无输入参数
function[r1,r2,r3,r4] = MyFunc
%若无输出参数
function MyFunc(a1,a2,a3,a4)
%既无输出也无输入
function MyFunc
函数书写时可以使用两个系统变量:nargin nargout
nargin:函数调用时输入参数个数
nargout:函数调用时输出参数个数
两个常用语句 return pause
return 返回调用函数
pause 暂停运行,任意键执行
pause(n) 暂停n秒
主函数与子函数
一个函数文件可以定义一个或者一个以上函数
一个函数文件中第一个函数是主函数,后面定义的是子函数
注意:
- 函数文件名一般与主函数名相同
- 子函数只能被所在的函数程序文件中其他函数调用
- 调用含有子函数的函数文件时,只执行主函数的语句块
- 主函数的语句块包含了调用某些子函数的语句
函数文件调用规则
- 主函数可以调用子函数
- 子函数可以调用子函数
- 子函数不能调用主函数
- 子函数可以调用其他程序文件
- 程序文件可以使脚本程序文件,也可以是函数程序文件
定义简单函数
inline函数
inline(expr) 根据expr建立内联函数,函数自变量符号根据表达式自动确定
inline(expr,arg1,arg2,···) 定义时候指定自变量符号
inline(expr,N) 自变量符号为x,P1,P2,······PN
例如:
f=inline('2*x.*x-+sin(exp(x))');
x = linspace(-10,10,100);
plot(x,f(x))
用inline函数创建初等函数十分简洁
计算多个点是,注意数组运算符的使用
匿名函数@定义方法
基本用法:@(参数列表)(函数表达式)
例如
>>f=@(x)(x.^2)
f=
@(x)(x.^2)
>> val=f(1:5)
val=
1 4 9 16 25
模块化设计
将要实现的功能分割为几个不同的模块并且:
- 将功能划分为多个模块
- 每个模块编写一个函数文件
- 整个功能实现编写一个程序(可以是函数文件,也可以是脚本文件)