目录
Matlab变量与常量
Matlab基本数据结构
Matlab空数组与子数组
Matlab算数运算符
传统算数运算
矩阵向量运算
常见的Matlab运算函数
后续还需学习的知识
Reference
Matlab变量与常量
变量默认为double型,包括由64位双精度浮点数构成的标量或数组。 double为双精度,-10^308~10^308,15~16位有效数字,占4个字节。
变量名由字母,数字,下划线构成。弱类型语言,大小写敏感。
Matlab的数据类型如下图所示。
变量初始化方法如下:
- 赋值语句初始化
- 用input函数从键盘输入,通过
help input
指令可以查看input指令的详细信息。
R = input('how many apple')
括号内表示提示信息。
matlab中的符号常量:
- i或j为虚数单位
- Inf或inf表示正无穷大
- NaN表示不定式,非数值量,产生于0/0,无穷/无穷,0*无穷等运算
- pi表示圆周率
-
eps,realmin,realmax分别表示Matlab中最小的浮点数精度,实数的最小值和最大值
这些常量的范围如下。
- ans为Matlab内置的变量(系统保留的变量名)
Matlab基本数据结构
Matlab的基本数据结构有:标量,向量(数组),矩阵
Matlab中空格可以分开一行的数字,也可以用逗号分开数字,比如small = [1,2],把逗号和空格混用也可以,但是这样看起来或者写起来会比较奇怪。
例如:
a=[1 2 3]
表示一个行向量b=[1 2 3]'
表示一个列向量 (一个单引号,表示转置)c=[1;2;3]
也表示一个列向量 (列向量有不同的表示方法)
在Matlab中可以用内置函数生成矩阵:
ones(4)
表示4*4的方阵,矩阵全部元素都为1ones(4,3)
第一个参数表示行,第二个参数表示列,矩阵全部元素都为1zeros(5)
,zero(4,5)
与上面的格式相同,只不过矩阵元素都为0-
eye(5)
表示5*5的单位矩阵,还有eye(2,3),按照单位矩阵来填,其余元素均为0eye()函数生成矩阵的示例如下:
![]/img/post3/2.jpg) -
randi()
函数可以用来生成随机数。rgn(0)
可以用来设置随机的seed。randi(IMAx,n)
表示生成[1,IMAX]
区间中的随机数,同时构造n*n
的矩阵。
randi(IMAX,n,m,p,...)
表示生成[1,IMAX]
区间中的随机数,同时构造n*m*p*...
的矩阵;也可以用这种形式rand(IMAX,[n,m,p,,,,])
。
IMAX
也可以替换成[A,B]
表示生成[A,B]
之间的随机数
冒号表达式生成矩阵:
j:k
生成[j,j+1,...,k]
的行向量 (j>k时生成空向量)-
j:i:k
生成[j,j+i,j+2*i,...,j+m*i] (j+m*i<=k)
,(1:2:100)'
表示由[1 3 5 ... 99]
组成的列向量l=(1:2:10)
这样打上括号以后用冒号表达式产生的序列l实际是一个数组,这里l也是行向量 a(i)
表示a数组的第i个元素d(i,j)
表示矩阵(i,j)
位置处的数据,注意:Matlab中按照列来存储,不是按行存储A(:,j)
表示矩阵A的第j
列全部元素,此时冒号代表所有元素-
A(i,:)
表示矩阵A的第i
行全部元素注意:Matlab的下标从1开始,而不是从0开始的,这与C语言中的语法有所不同
A(i:j,k)
引用A[i][k]
到A[j][k]
的向量-
A(i:j)
表示矩阵A的a[i][1]
到a[j][1]
这些元素构成的数组,第二维不写的话默认值为1,即第1列
A(i:j:k,l)
定义了A[i][k],A[i+j][k],...A[i+m*j][k]
组成的向量,其中i+m*j<=k
- 定义矩阵不能缺少元素,否则会出错
可以通过赋值语句定义矩阵。比如,k(2,3)=8
结果如下
k=
0 0 0
0 0 8
Matlab中也可以用矩阵嵌套来生成矩阵。比如l=[k,k]
以行的形式进行矩阵嵌套,结果如下:
l=
0 0 0 0 0 0
0 0 8 0 0 8
当然也可以执行l=[k;k]
以列的形式进行矩阵嵌套。
此外,还有这样的矩阵表示方法。
>>l=[1:2:6;2 4 6]
%其中第一行为1 3 5,第二行为2 4 6
Matlab中的size
函数通过这样的指令:size(A)
(其中A代表二维矩阵)可以返回矩阵对应的行和列的维数
ans=
2 3
当命令为[r,c]=size(A)
时,即输出为两个元素的数组,则r代表矩阵的行数,c代表矩阵的列数。如果命令为size(A,n)
的形式,则当n=1时,返回矩阵的行数,n=2时返回矩阵的列数。
length
函数通过这样调用length(l)
来返回一个矩阵行和列中最大的一个,所以这个指令的返回结果为3
如果矩阵比较大时,在workspace中输入矩阵名称,双击以后就可以像excel一样输入,十分方便
MatLab中的空数组和子数组
a=[]
表示空矩阵。
b=magic(4)
表示生成魔方矩阵,矩阵元素如下:
b=
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
c=b(3,:)
取出b矩阵第3行所有元素构成行向量c=b(3,[2,4])
取出b矩阵第3行的第2列和第4列的元素构成行向量,注意里面必须用[2,4]方括号,而不能用圆括号c=b(3,2:end)
取出b矩阵第3行的第2列直到最后一列的元素
在Matlab中,linspace函数以等差数列方式形成数组,logspace函数以等比数列方式形成数组。
linspace(x1,x2)
默认返回100个x1到x2之间的数,包括x1和x2在内linspace(x1,x2,N)
返回N个x1到x2之间的数,N<2时返回x2,包括x1和x2在内logspace(x1,x2)
生成一个10^x1,到10^x2之间的50个数字,包括x1和x2在内logspace(x1,x2,N)
生成N个等比数列的元素,包括x1和x2在内
reshape函数将已知的数组或矩阵生成参数所设定的矩阵的形状
>> 1:1:9
%结果如下:
ans=
1 2 3 4 5 6 7 8 9
>> reshape(ans,3,3)
%结果如下:
ans=
1 4 7
2 5 8
3 6 9
reshape(x,m,n)
函数将x生成m*n维数组-
reshape(x,m,n,p,...)
函数将x生成m*n*p*…的高维数组但是需要注意:
resize(x,m,n,p,...)
必须保证n*m*p*...=numel(x)
,否则会报错,其中numel(x)函数用来表示矩阵x中元素的个数
这里再介绍几个Matlab的系统预定义变量:date,clock,year,month,now,today
date
返回当前日期,按照日-月-年格式返回clock
返回当前的时间year(now)
返回当前的年,month(now)
返回当前的月,day(now)
返回当前的日,day(today)
和day(now)
结果相同
Matlab算数运算符
传统算数运算
算数除法
>> 5/6
ans=
0.83333333333333
右除,第一个数字为除数,第二个为被除数
>> 5\6
ans=
1.20000000000000
我用Matlab R2014b执行这两个命令,得到的结果都只保留了5位有效数字,和上面这个不一样。
5^2
表示5的平方,power(5,2)
也可以表示5的平方
传统算数运算中的中括号,大括号在Matlab中都用小括号替代,比如算式3*(5*(4+6))
,因此在计算时需要注意运算符的优先级,在合适的地方恰当地使用小括号。
矩阵向量运算
矩阵加法,减法,乘法,除法四种运算 对应==> + - * / \
五个符号
矩阵除法相当于A与B的逆矩阵相乘。所以A/B=A*inv(B)
等式成立,其中inv(B)
表示B的逆矩阵。
矩阵也可以右除,有该等式成立A\B=inv(A)*B
矩阵乘方运算,A^3
表示三个A矩阵连续做矩阵乘法,而不是矩阵元素的三次幂
Matlab区分数组和矩阵,在相应的运算符前加点.
符号。
A.*B
表示A中对应位置的元素和B中对应位置的元素相乘。和A*B
严格按照矩阵乘法运算不同。
>> a=[1 2 3]
>> b=[1 2 3]'
>> a.*b %这样会出错,因为a和b对应位置不同
当A为矩阵时,
A.^3
就表示每个位置上的数字做相应的乘方运算A./3
就表示每个位置上的数字除以3A.\3
就表示每个位置上的数字被3除A+3
表示A中每个元素都加上3A.+3
就会出现错误
常见Matlab运算函数
-
sin()
函数参数为弧度值,sin(A)
中A为矩阵时,相当于对A矩阵中每个元素求其sin的值。 -
log()
对数函数以e为底,log2()
对数函数以2为底,log10()
对数函数以10为底。 -
abs()函数为绝对值函数,sqrt()函数为开根号运算,
sign()
函数为取符号函数。 -
ceil()
函数为向上取整函数,floor()函数为向下取整函数,fix()
函数表示向0取整函数,round()
函数表示向最近的整数取整,按照四舍五入规则。round(-3.5)=-4
对绝对值四舍五入。 -
mod()
和rem()
都为取模运算函数mod(-5,3)=-2
,rem(-5,3)=1
。注意根据实际需要选择合适的取模函数 -
conv(u,v)
函数和deconv(u,v)
函数可以计算多项式乘法和除法,其中u和v都为多项式,对多项式系数按照降幂排列。Matlab中的
conv
和deconv
函数不仅可以用于多项式的乘除运算,还可以用于两个有限长序列的卷积和解积运算。Matlab提供的函数
conv
,语法格式:w=conv(u,v)
,其中u和v分别是有限长度序列向量,w是u和v的卷积结果序列向量。如果向量u和v的长度分别为N和M,则向量w的长度为N+M-1.如果向量u和v是两个多项式的系数,则w就是这两个多项式乘积的系数。对于卷积运算的细节可以参考这篇博客。 -
sum()
函数为求和函数,prob()
函数为求积函数,max()
函数为取最大值函数,min()
函数为取最小值函数若A为矩阵,
max(A)
求出的是每一列的最大值组成一个行向量。max(max(A))
就可以找到矩阵中的最大的元素[Y,I]=max(X)
返回矩阵或向量的最大值和它对应的下标 -
median(a)
返回向量中的中值,median(A)
返回向量中的第一个不是1的维度的中值组成的向量,median(A,DIM)
表示顺着A矩阵第DIM个维度来求得的整个矩阵的中值行向量例子:
A=[1 2 4 4;3 4 6 6;5 6 8 8;5 6 8 8]
; 这是一个4*4的矩阵,默认从第一个非1的维度求解,此时从第一维求解。即从水平方向看,求出每一列的中值然后组成行向量,即median(A)=[4 5 7 7]
,如果是median(A,2)
则相当于是从竖直方向看,求出每一行的中值然后组成列向量,即median(A,2)=[3 5 7 7]'
,注意此时生成的是列向量。 -
mean()
函数为取平均值函数,用法及参数和median()
函数大致相同 -
real()
函数表示求解复数的实部;imag()
函数表示求解复数的虚部;abs()
函数表示求解复数的模;angle()
函数表示求解复数的辐角;conj()
函数表示取复数的共轭复数,和复数加一个引号’的用法一样。 -
cross(a,b)
函数对矩阵做叉积;dot
函数对向量做点积;compan
函数生成多项式的伴随矩阵,不能用它来直接求矩阵的伴随矩阵;inv
表示求矩阵的逆矩阵;det
函数表示求矩阵的行列式;rank
函数求矩阵的秩;trace
函数求矩阵的迹;eig
函数求解矩阵的特征值。需要注意cross(A,B)中的A和B均为向量时,A和B的长度都必须为3,否则就会报错,此时函数返回A和B向量的叉积。
当A和B为矩阵或高维数组时,必须保证A和B的每个维度的大小都相同,此外所有维度中必须保证至少有一个维度为3,该函数会将A和B看成是有多个3维向量组成的数组,然后求出对应的3维向量做叉积后形成的矩阵。
后续还需学习的知识
- 弄清楚Matlab数据类型中构造型和符号对象的具体用法和细节
- 之后还需要继续学习Matlab的相关语法,熟悉矩阵和向量操作
- 记着翻阅别的博客中关于Matlab的conv函数介绍,在以后会比较多地使用该函数进行卷积操作等。
Reference
Matlab视频教程
http://www.51zxw.net/list.aspx?page=3&cid=456