特殊变量和常量
使用iskeyword
命令可以看到众关键字,但还有些特殊变量和常量也不能作为标识符来使用。
- ans:最近一次计算的结果
- i,j:用于表示复数
- Inf(即inf):无穷大,试计算
1/0
和log(0)
将分别得到正负无穷大 - eps:表示浮点数的相对精度,浮点数越靠近0精度越大,MATLAB无法表示1至1+1eps之间的数,也无法表示2至2+2eps之间的数
- NaN:Not a Number,试计算
Inf/Inf
- pi:圆周率
常用技巧
help
使用help
后跟要用的方法,可以显示其简要使用信息,要查询详细使用方式可以在右上角搜索文档。
clear
使用clear
后跟变量名可以将指定变量从workspace清除,也可以在右上角工作区右击删除。如果直接使用clear
将清空工作区所有变量。
format
使用format
后根具体的数值类型,可以修改控制台输出显示的数值精度。如pi
在format long
下显示为3.141592653589793。
- short:小数点后4位
- long:对double数小数点后15位,对single数则是小数点后7位
- shortE:short的科学计数法
- longE:long的科学计数法
- bank:小数点后2位
- hex:对double数的二进制的16进制表示
- rat:用小分子分母表示的分数(可以将无理数表示成近似的有理数的分数表示,也常用于分数运算希望得到的结果也是分数)
行尾分号
在交互环境下行尾使用分号;
表示不打印计算结果,当计算结果很大时(比如数字图像处理得到图像矩阵),打印会很耗时。
who和whos
使用who
查看工作区变量,使用whos
查看工作区变量的详细信息。实际可以直接在右上角工作区查看,更加方便。
clc
清屏,但不会影响到工作区。
数组(向量和矩阵)
行向量
a = [1 2 3 4]
列向量
b = [1;2;3;4]
矩阵乘法
这里的行向量和列向量实际上都是某个维度为1的矩阵,和矩阵乘法无二。
>> a*b
ans =
30
>> b*a
ans =
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
矩阵
>> A=[1 21 6;5 17 9;31 2 7]
A =
1 21 6
5 17 9
31 2 7
索引
注意MATLAB的索引是从1开始的,而不是从0开始的,并且使用()
而不是[]
来做索引。下面以前面的矩阵A为例子。
取第1行第2列
>> A(1,2)
ans =
21
取第1第3行的第2第3列
>> A([1 3],[2 3])
ans =
21 6
2 7
取flatten后的第4个元素
特别注意,MATLAB的flatten先纵再横,而不是先横着数再纵着数。
>> A(4)
ans =
21
取flatten后的第1,3,5个元素
>> A([1 3 5])
ans =
1 31 17
取flatten后的第1,3个元素两行
>> A([1 3;1 3])
ans =
1 31
1 31
Colon Operator
这里直译过来是冒号操作,可以用来生成一系列的连续数,更进一步也就可以实现切片索引了。
从下面例子中可以看到,第一个数表示起始数,最后一个数表示最多可到达的数,中间的数表示step,默认step为1。
>> B=[1:6]
B =
1 2 3 4 5 6
>> C=[1:2:6]
C =
1 3 5
>> C=[1:2:5]
C =
1 3 5
还可以用来生成字符串:
>> str = 'a':2:'z'
str =
acegikmoqsuwy
用于对矩阵做切片,如取A的第三行:
>> A(3,:)
ans =
31 2 7
若要将某行或某列删除,只要将空向量赋值给它,如删除A的第三列,只要A(:,3)=[]
即可。
Array Concatenation
可以方便地将多个矩阵拼接在一起,如:
>> A=[1 2;3 4]
A =
1 2
3 4
>> B=[9 9;9 9]
B =
9 9
9 9
>> C=[5 6 7 8]
C =
5 6 7 8
>> D=[-2 -1 0 1]
D =
-2 -1 0 1
>> E=[A B;C;D]
E =
1 2 9 9
3 4 9 9
5 6 7 8
-2 -1 0 1
Array Manipulation
矩阵之间可以进行四则运算,假设有这样两个矩阵A和B:
>> A=[1 2 3;4 5 6;7 8 9]
A =
1 2 3
4 5 6
7 8 9
>> B=[2 2 2;2 2 2;2 2 2]
B =
2 2 2
2 2 2
2 2 2
以及一个常量a:
>> a=2
a =
2
矩阵加减法
>> A+B
ans =
3 4 5
6 7 8
9 10 11
>> A-B
ans =
-1 0 1
2 3 4
5 6 7
次方
次方操作相当于在做这么多个矩阵乘法:
>> A^2
ans =
30 36 42
66 81 96
102 126 150
>> A*A
ans =
30 36 42
66 81 96
102 126 150
如果希望对每个元素作此操作,而不是对整个矩阵,即若希望是element-wise的形式,要加个.
号:
>> A.^2
ans =
1 4 9
16 25 36
49 64 81
哈达玛积
基于前面的element-wise显然可以这样表示哈达玛积(对应元素相乘):
>> A.*B
ans =
2 4 6
8 10 12
14 16 18
类似地,有:
>> A./B
ans =
0.5000 1.0000 1.5000
2.0000 2.5000 3.0000
3.5000 4.0000 4.5000
转置
使用'
符号对矩阵转置:
>> A'
ans =
1 4 7
2 5 8
3 6 9
矩阵逆和矩阵除法
为了求逆,让B是一个可逆矩阵,然后求逆,使用inv()
操作即可。而矩阵除法A/B
实际就是让A右乘B的逆矩阵:
>> B=[1 2 3;0 1 4;5 6 0]
B =
1 2 3
0 1 4
5 6 0
>> A/B
ans =
1.0000 0.0000 0.0000
-26.0000 21.0000 6.0000
-53.0000 42.0000 12.0000
>> A*inv(B)
ans =
1.0000 0.0000 0.0000
-26.0000 21.0000 6.0000
-53.0000 42.0000 12.0000
此外,矩阵除法B\A
则是让A左乘B的逆矩阵:
>> B\A
ans =
83.0000 82.0000 81.0000
-68.0000 -67.0000 -66.0000
18.0000 18.0000 18.0000
>> inv(B)*A
ans =
83.0000 82.0000 81.0000
-68.0000 -67.0000 -66.0000
18.0000 18.0000 18.0000
伪逆
对于奇异矩阵(不可逆的方阵),可以用pinv()
操作求其伪逆。
生成一些特殊的矩阵
- linspace:一定区间内的等差数列向量
- eye:指定阶的单位阵
- zeros:指定维度的全0矩阵
- ones:指定维度的全1矩阵
- diag:对角方阵
- rand:指定维度的平均随机数矩阵
矩阵上的一些函数操作
- max(A):每一列中最大的值,有多少列得到的向量中就有多少个数
- max(max(A)):矩阵中的最大元素
- min(A):每一列中最小的值,有多少列得到的向量中就有多少个数
- min(min(A)):矩阵中的最小元素
- sum(A):每一列上所有元素加起来,有多少列得到的向量中就有多少个数
- sum(sum(A)):矩阵中所有元素求和
- mean(A):每一列上所有元素求平均,有多少列得到的向量中就有多少个数
- mean(mean(A)):矩阵中所有元素求平均
- sort(A):对每一列从小到大排序
- sortrows(A,k):按照第k列的元素大小,对矩阵的所有行进行排序,此操作不会改变行内元素顺序
- size(A):矩阵的shape
- length(A):矩阵的长度(最后一个维度,二维即是列的数目)
- find(A==k):矩阵中等于k的元素位置的标号组成的列向量(位置标号是按列flatten后的从1开始的索引号)