MATLAB速成
前言
这学期的通信原理课程有实验课,是要用到matlab的,其实在之前学信号与系统和数字信号处理的时候,这两门课的实验课也是用matlab来完成的,但是我们学校没有开设matlab这门课程,在上实验课的时候老师也知道我们都不会,所以干脆直接把答案发出来让我们自己对着敲一遍,刚开始的时候自己其实也还是会学一点的,但是因为有答案,所以也就慢慢的变得摆烂了,反正自己也不学matlab,也就实验课会用一下,而且答案都有了,cv一下就可以了,所以对于matlab自己一直是处于置之不理的状态,这学期的通信原理老师要求的就稍微严一点了,没有给我们答案,但给了一个样例,但我也看不懂啊,这怎么办,一不做二不休,现学现卖,都学过好几门编程语言了,再学个matlab有多难?于是就有了这个matlab的速成,有兴趣参加数学建模比赛的其实也可以看一下,都是一些比较常用的函数与语法。
因为是速成,所以写的比较简略,有的地方一笔带过。
我才疏学浅,如果有不对或者遗漏的地方,欢迎各位大佬来指正,一起进步。
MATLAB基本使用
这里我用的是matlab7,版本比较低,应该是04年发布的版本,因为我看新版的matlab和学校电脑的matlab界面变化有些大,我为了和学校机房电脑的版本一致,我就选择了matlab7,介绍一下matlab的基本使用
打开matlab之后,界面如下
最右边的部分是命令窗口,可以理解为控制台,可以在这里直接输入数据,下面来举个例子
有>>的代表是我输入的部分,敲下回车后命令窗口会给你回应,比如我想知道a+b等于多少,给a和b分别赋值就可以了,然后输入a+b就能出现结果了,那如果我想输入新的数据该如何呢,可以在命令窗口敲clc执行清屏,这样命令窗口就会删除上面的命令。
执行完清屏操作后的界面。
接下来介绍如何新建文件以及如何编写代码。
这里我们选择M-file文件,这里因为我使用matlab只是用来做实验,所以其他几个几乎用不到就只介绍这一个。点击之后就会出现一个代码窗口,就可以在这里开始敲代码了。编写完之后记得保存。
矩阵
学过线性代数的应该都知道矩阵,那么在matlab中如何定义一个矩阵呢,非常简单,来试一下。
matlab
%定义一个矩阵
A = [1 2 3;4 5 6;7 8 9]
%求转置矩阵
B = A'
%把矩阵变成一列的形式,按列变
C = A(:)
%求逆矩阵
D = inv(A)
%生成一个10行5列的0矩阵,后面的3代表三维
E = zeros(10,5,3)
那怎么运行呢,我们选中编写的代码,点击鼠标右键,选择第一个,这里需要注意一下,你选中了那些代码,就会执行哪些,如果你
只选中了B = A',那就会报错,需要将前面的A = [1 2 3;4 5 6;7 8 9]也选中。
点击之后好像没有什么反应?我们回到刚刚的命令窗口,命令窗口就相当于我们的控制台,结果会在这里输出。
下面介绍几种常用的矩阵函数
matlab
%rand生成均匀分布的伪随机数分布在0-1之间
%rand(m,n)生成m行n列的均匀分布的伪随机数
%rand(m,n,'double')生成指定精度的位随机数
%randn生成标准正态分布的伪随机数(均值为0,方差为1)
%randi生成均匀分布的伪随机整数
%randi(iMax)在开区间0-iMax生成均匀分布的伪随机整数
%randi(Imax,m,n)在开区间(0,iMax)生成m*n型随机矩阵
%r = randi([iMin,m,n],m,n)在开区间iMin-iMax生成m*n型随机矩阵
元胞数组
元胞数组和我们平常在Java和C中学习的数组有些不太一样,在元胞数组中可以存储任意的数据结构,不需要进行定义,我觉得和Java中的集合有些像。
matlab
%元胞数组
%定义一个1行6列的数组,数组中的内容可以是任意的数据结构,跟Java的集合有点像
A = cell(1,6)
%eye函数用于生成一个单位矩阵,3代表生成一个三行三列的单位矩阵
%matlab中的索引是从1开始的,因为我用的是matlab7,是比较古老的版本了,可能在未来的版本中会出现从0开始的索引
%因为像java,c,python他们的索引都是从0开始的
%把eye(3)赋值给A的第二个索引
A{2} = eye(3)
%magic字面意思就是魔法,在matlab中用来生成n阶幻方,比如三阶幻方
%% 就是1-9九个数字,组成3*3矩阵,使得该矩阵无论横竖斜
%三个方向上的三个数字之和总是相同的
%magic(n)生成一个n阶幻方,就是把1-n的平方排成一个n*n的矩阵,使得
% 各个方向上的数字之和都相等(容易证明,这个和等于n*(n^2+1)/2)
A{5} = magic(5)
B = A{5}
结构体
matlab
%结构体
books = struct('name',{{'Machine Learning','Data Mining'}},'price',[30 40])
books.name
books.name()
books.name{1}
来看一下执行结果,相信学过其他编程语言的看一遍就知道是什么意思了
矩阵的其他内容
matlab
%矩阵的定义与构造
A = [1 2 3 4 5 6 7 8 9]
%1和9代表从1-9,3代表步长,可以理解为每一步走了多远
%必须指定中间的步长
B = 1:2:9
%重复B,重复3行1列
C = repmat(B,3,1)
%两列
C = repmat(B,3,2)
%生成两行四列的全1的矩阵
D = ones(2,4)
%矩阵的四则运算
A = [1 2 3 4;5 6 7 8]
B = [1 1 2 2;2 2 1 1]
C = A+B
D = A-B
E = A*B'
%加点代表对应项相乘,不加点代表矩阵相乘
F = A .* B
%相当于A*B的逆inv
G = A / B
%代表对应项相乘
H = A ./ B
%矩阵的下标
A = magic(5)
%代表B是A的第二行第三列
B = A(2,3)
%在matlab中,冒号所代表的就是所有,那么这一行代码表示的就是A的第三行
C = A(3,:)
%这个代表第四列
D = A(:,4)
%找到大于20的序号值,m代表行数,r代表列数
[m,r] = find(A>20)
因为都比较简单,就一笔带过了。
逻辑控制
同样的,学过其他编程语言的可能看一遍就会了,这里直接附上代码,扫一眼就会了。
matlab
%逻辑与流程控制
%for循环
%语法 for 循环变量 = 初值:步长:终值
% 执行语句1
% 执行语句2
% end
%如果步长为1则可以省略
sum = 0
for n = 1:5
sum = sum + n^2
end
%同样的,for循环也可以进行嵌套
%求从1到5的阶乘的和
sum = 0
for i = 1:5
p=1
for j = 1 : i
p = p*j;
end
sum = sum+p
end
%while循环
%while 条件表达式
% 执行语句1
% 执行语句2
% end
%求1-10的和
sum = 0
n = 1
while n<10
sum = sum+n
n=n+1;
end
%if end
a = 100
b = 20
if a>b
'成立'
end
%if else end
a = 10
b = 20
if a>b
'成立'
else
'不成立'
end
二维绘图
这个就比较重要了,我们实验课基本都是需要绘图的,但是也比较简单,看过前面的代码后,再来看这段就很容易理解了。
matlab
%二维平面绘图
x = 0:0.01:2*pi
y = sin(x)
figure%建立一个幕布
plot(x,y)
%标题
title('y = sin(x)')
%x轴标签
xlabel('x')
%y轴标签
ylabel('sin(x)')
%表示x轴的边界最多是2*pi
xlim([0 2*pi])
%颜色选项参数
%红 r ;粉红m;绿 g;青 c;蓝 b;白 w;黄 y;黑 k;
%实线 -;虚线--;冒号线 :;点画线 -,;
%二维绘图
x = 0:0.01:20;
%exp就是e的次方
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
figure
%这个就跟定义一个函数或者方法一样,建立H1,和H2两个线,他们公用一个x轴
[AX,H1,H2] = plotyy(x,y1,x,y2,'plot');
%这个是定义H1的Y轴标签
set(get(AX(1),'Ylabel'),'String','Slow Decay')
%这个是定义H2的Y轴标签
set(get(AX(2),'Ylabel'),'String','Fast Decay')
%X轴的标签
Xlabel('Time(\musec)')
title('Multiple Decay Rates')
%这个是定义H1的绘图线使用哪一种
set(H1,'LineStyle','--')
set(H2,'LineStyle',':')
后记
这个速成课是我在b站上跟着up主爱研究的小阿楠学习的,讲的非常好,零基础的也可以去听,我在这只是整理了一下代码,后面的三维绘图等我用不到因此我就没有整理,学完上面的之后去看实验报告的样例就能看个七七八八了,虽然有一些函数没有讲到,但是利用搜索引擎和各种ai可以很快的了解。