久闻Matlab的大名,可惜一直没有好好学学。现在正好装了个最新的版本,就来学习一下Matlab,了解一下它的强大的功能。
程序界面
打开Matlab会看到类似的程序界面,上边是菜单栏,包含了各种工具。左边是文件视图,列出了项目中的所有文件。中间是代码和命令行窗口。右边则是工作区窗口,每次在代码中输入的变量都会作为工作区变量保存在工作区中。
数据类型
Matlab中其实所有变量都是矩阵,不过如果你只指定了一个值的话,那么它其实就是一个1X1的矩阵。
矩阵和数组
数组使用方括号声明,数组元素使用空格或者逗号分隔开。这样的数组又叫做行矢量。
% 数组
array1 = [1,2,3,4,5]
array2 = [1 3 5 9 7]
要创建矩阵,使用分号分隔的多行数据。
m = [1,2,3; 4,5,6; 7,8,9]
另外还有几个方法用于创建初始值为0、1、均匀随机、正态分布随机的矩阵,它们的参数分别是行和列的个数。
% 创建矩阵
m0 = zeros(3,3)
m1 = ones(3,3)
m2 = rand(3,3)
m3 = randn(3,3)
如果要转置矩阵,使用单引号。
% 转置矩阵
m = m'
两个某一维度相同的矩阵可以串联,逗号分隔为水平串联,分号分隔为垂直串联。下面[m,n]结果是3X6的矩阵,而[m;n]是6X3的矩阵。
% 水平串联和垂直串联
n = zeros(3,3)
[m,n]
[m;n]
矩阵与一个数运算,结果会应用到矩阵所有元素上。如果矩阵和矩阵运算,结果遵循矩阵计算法则。如果希望将两个矩阵对应元素进行计算,需要使用.运算符
的语法。
% 矩阵运算
a
a*3
a+a
a*a
a.*a
结果如下。
a =
1 2
3 4
ans =
3 6
9 12
ans =
2 4
6 8
ans =
7 10
15 22
ans =
1 4
9 16
索引运算
有时候可能需要对数组或矩阵中某些值进行计算,这时候可以利用索引运算进行。如果尝试访问矩阵中不存在的元素,会导致错误。不过如果是对不存在的元素赋值,Matlab会自动扩展矩阵,新创建的元素都为0.
a = [1,2,3; 4,5,6; 7,7,8]
>> a(1,1)
ans =
1
>> a(4,4)=2
a =
1 2 3 0
4 5 6 0
7 7 8 0
0 0 0 2
如果需要访问多行或多列,使用冒号运算符。下面分别获取了矩阵2-4行与1-3列的元素,以及第三行的所有元素。
>> a(2:4,1:3)
ans =
4 5 6
7 7 8
0 0 0
>> a(3,:)
ans =
7 7 8 0
冒号运算符还可以用于创建等距离矢量,语法是[起始:步长:结束]
,其中步长可以省略,默认是1。
m = [0:10:100]
m =
0 10 20 30 40 50 60 70 80 90 100
矩阵计算
Matlab的英文全名即Matrix Laboratory(矩阵实验室),可见矩阵在Matlab中的重要地位。前面已经介绍了一些矩阵的知识,下面继续介绍一些矩阵的方法。
首先是矩阵求和,默认情况下对于矩阵执行sum函数会得到各列的和。
m = [1,2,3; 4,5,6; 7,8,9]
m =
1 2 3
4 5 6
7 8 9
% 矩阵求和
sum(m)
ans =
12 15 18
如果希望得到各行的和,需要在sum函数上指定第二个参数。
sum(m,2)
ans =
6
15
24
如果要获取对角线的和,可以使用diag函数先得到对角线矢量。
diag(m)
ans =
1
5
9
如果要得到反对角线,Matlab没有提供直接方法。不过我们可以利用fliplr函数先对矩阵进行左右翻转,然后再求对角线。
diag(fliplr(m))
ans =
3
5
7
有一种特殊的矩阵叫做幻方,这种矩阵各行、各列、以及两条对角线的和都是相同的。Matlab内置了函数magic,可以生成指定维度的幻方。
% 幻方
disp('----------幻方------------')
m = magic(3)
disp('各行的和:')
sum(m,2)
disp('各列的和:')
sum(m)
disp('对角线的和:')
sum(diag(m))
sum(diag(fliplr(m)))
文本和字符
字符串使用单引号包括,如果字符串内部也有单引号,使用两个连续的单引号。
% 文本和字符
text = 'This is a ''special'' date'
text =
'This is a 'special' date'
如果要查看变量类型的话,可以使用whos命令。
% 查看变量类型
whos text
Name Size Bytes Class Attributes
text 1x24 48 char
连接字符串使用方括号将要连接的字符串括在一起。
% 连接字符串
hello = 'How are you ?'
[text, '. ', hello]
ans =
'This is a 'special' date. How are you ?'
字符和数字之间也可以互相转换。
% 字符与数字转换
c = '1'
n = 1
num2str(n)
str2num(c)
编程
条件语句
下面是Matlab中if语句的例子,生成一个随机数并判断在哪个区间中。
% 条件语句
N = 0.5
n = rand
if n < N
disp('n < .5')
elseif n < .3
disp('n <.3')
else
disp('other')
end
然后是switch语句的例子。
% switch语句
n = 3
switch(n)
case {1,2}
disp('n = 1 or 2')
case {3,4,5}
disp('n is 3,4,5')
otherwise
disp('other case')
end
循环语句
首先是for循环。
% for循环
for i = 1:5
disp(i)
end
然后是while循环。
% while循环
n = 1
while n < 10
n = n + 1
end
格式化
format函数可以控制数据如何在Matlab中显示。
% 格式化
a = [1/3 .1111]
format short
a
format long
a
format bank
a
format short e
a
format rat
a
format hex
a
a =
0.3333 0.1111
a =
0.333333333333333 0.111100000000000
a =
0.33 0.11
a =
3.3333e-01 1.1110e-01
a =
1/3 1111/10000
a =
3fd5555555555555 3fbc710cb295e9e2
每行Matlab代码在执行的时候都会在命令窗口中显示输出,在大型程序中会导致代码输出很乱。我们可以通过在代码后面添加分号来提示Matlab不要输出。
% 取消输出
longMatrix = [0:1000];
如果代码太长,可以将代码分成几行来编写,在需要分行的代码末尾添加三个点号即可。
% 长语句
longStatement = 1+2+3+4 ...
+5+6+7+8+9
绘图
二维图
绘制二维图很简单,只要提供x和y的数值即可。下面是绘制-2π到2π的正弦图像的例子。
% 二维图
x = [-2*pi:pi/100:2*pi]
y = sin(x)
plot(x,y)
会弹出下图所示的图形窗口。
为提高可读性还可以添加一些注释。
% 添加注释
xlabel('x')
ylabel('sin(x)')
title('-2π到2π间的正弦图像')
每次调用plot函数都会重新绘图,如果想在已有的图表上画新图形,需要使用hold on
命令。在调用hold off
命令之前,所有图表都会添加到已有的图形上。plot函数的第三个参数可以指定画图线条的颜色和形状,颜色使用RGB等字母指定,形状会使用所给定的字符绘制线条。
% 图像都画在一张图上
hold on
y = cos(x)
plot(x,y,'g--')
三维图
三维图形的绘制也是类似的,首先用meshgrid函数生成一个区域的点集,然后指定z与xy的关系。绘制三维图有两个函数,surf函数会用颜色填充三维图形的面。而mesh函数只会填充线条。这里为了方便显示使用subplot函数绘制子图,该函数前两个参数指定子图的行数和列数,第三个参数指定要画的子图顺序。调用该函数之后,可以调用实际绘图函数来绘图。
% -------------三维图-------------
% 生成x,y点集
[x,y] = meshgrid(-10:.5:10)
% 指定函数
z = x.^2 + y
% 绘制三维图
subplot(2,1,1)
surf(x,y,z)
title('surf绘图')
subplot(2,1,2)
mesh(x,y,z)
title('mesh绘图')
上面的代码会显示类似下面的图像。
帮助
Matlab有比较完善的中文帮助,按F1即可打开帮助。
如果想了解某个App的功能,可以直接在命令窗口中输入help appname
来获得相关函数信息。
>> help stats
Statistics and Machine Learning Toolbox
Version 11.2 (R2017b) 24-Jul-2017
Distributions.
Parameter estimation.
betafit - Beta parameter estimation.
binofit - Binomial parameter estimation.
distributionFitter - Distribution fitting app.
evfit - Extreme value parameter estimation.
expfit - Exponential parameter estimation.
...
如果希望了解某个函数的详细信息,可以用doc 函数名
来查阅文档,例如doc max
就会列出max函数的详细文档。
以上就是Matlab的一点知识了,希望可以让没有使用过Matlab的同学对它有一个大致了解。当然这里列出的功能仅仅是Matlab的冰山一角。在安装Matlab的时候我们可以看到它有非常丰富的组件,每一个组件都包含了专业领域大量的函数和功能,只有深入了解之后才会体会到Matlab的强大之处。有兴趣的同学可以深入了解。