Matlab 学习笔记

简介

Matlab 是 Matrix 和 Laboratory (矩阵实验室)的缩写,所以最初创造它的目的就是解决线性代数中的矩阵运算问题的。Matlab是一种用于算法开发,数据可视化,数据分析以及数值计算的高级技术计算语言和交互式环境。

(本文每个代码块都是可以独立运行的,可以运行试试, 但有时记得clear一下)

学习笔记

基础语法

1
2
3
4
5
6
7
8
a = 1   %意味着a是一个double的数据
class(a) %可以查看a是什么类型的数据
abs('a')
double('a') %这两种方式可以输出字符a的ASCII码,当然abs()也是绝对值函数,后面还会说
char(97) %可以将ASCII对应的字符输出
clear %清空所有变量
clear(a) %清空a变量
clc %清屏(经常用)
结构体
1
2
3
4
5
6
7
8
a.x = 1
a.y = 1
a.z = 1 %为结构体赋值
isstruct(a) %是否为结构体
fieldnames(a) %显示结构体的成员
isfield(a,'x') %是否为结构体的成员
rmfield(a,'x') %删除结构体的成员
getfield(a,'y') %获取结构体某个成员的值
固定变量
1
2
3
4
pi        %显示3.1416
z = i %显示0.00 + 1.00i
x = 1/0 %显示Inf
0/0 %显示NaN 意思为 Not a number ,指值不确定
常用的数学函数: sin(x),asin(x),abs,sqrt,ceil,fix,floor,round
1
2
3
4
5
6
7
8
9
10
11
x = 0:pi/6:pi       %第二个数值pi/6指的是步长
y = sin(x)
z = asin(y) %即为x
x = [-4 9 -16 25]
y = abs(x)
z = sqrt(y)
x = [-1.6 -0.2 1.2 0.6];
y = ceil(x) %向上取整
z = floor(x) %向下取整
g = fix(x) %向着坐标原点取整
f = round(x) %四舍五入
基本语句的一个举例
1
2
3
4
5
6
x = 0;
for i = 1:10
if mod(i , 2)
x = x + i;
end
end %求1 - 10内的奇数和

矩阵的基本运算

一些常用的操作
1
2
3
4
5
6
7
8
9
x = [1 2 3; 4 5 6; 7 8 9]
[m, n] = find(x == 8) %返回行标和列标
ind = find(x == 8) %返回序号
size(x) %矩阵的大小
x = reshape(x,1,9) %重排矩阵
x = [1 2 3; 1 2 3; 1 2 3]
x = unique(x) %删除相同元素 实现矩阵压缩
S = rand(10,1) %rand产生0-1的随机矩阵
S = randn(1, 10) %randn产生均值为0,方差为1的随机矩阵
初始化矩阵
1
2
3
4
5
6
7
8
9
x = [1 2 3; 4 5 6; 7 8 9]    %分号代表换行  或者是:
y = [1 2 3
4 5 6]
x = [0:2] % 这个矩阵的初始元素是0 末尾元素是2 步长默认为1
x = [0:0.5:2] %步长为0.5
x = linspace(0 ,2, 5) %初始元素为0,末尾元素为2,总共5个元素,这个可以与前边的方式混用
x = zeros(2,3) %初始化一个2行3列的零矩阵
x = ones(2,3) %初始化2行3列的元素全为1的矩阵
x = eye(2) %初始化一个2行2列的单位矩阵
矩阵的基本运算
1
2
3
4
5
6
7
8
9
10
11
A = [1 2 3; 4 5 6; 7 8 9];       %末尾有分号代表系统不必输出该矩阵。
B = [1 3 5; 6 9 0; 2 4 6];
C = A + B
D = A - B
E = A * B %矩阵A乘以B(与Python不一样)
F = A.* B %矩阵A中的元素与对应位置上的B中的元素相乘,只是对应相乘
G = A / B %实际为A * B的逆
H = A./ B
I = A ^ 2 %矩阵相乘 = A * A
J = A.^ 2 %只是对应的元素自身进行平方
A = A' %矩阵的转置
矩阵或者数组行列块的取值与赋值
1
2
3
4
5
6
7
8
A = [1 2 3; 4 5 6; 7 8 9];
x = A(1, 3) %取出第一行第三列的元素(没有第0行和第0列,与Python不同)
x = A(4) %取出第4个元素,注意的是,matlab是按列存的。
y = A(2, :) %取出第二行的元素。
z = A(1:2, 1:3)
A(1,3)= 0
A(2 ,:)= [6 5 4]
A(1:2,1:2) = [-1 -2 ; -3 -4]
比较和逻辑运算
1
2
3
4
5
6
7
8
9
A = [1 2 3
4 5 6]
B = [4 5 6
7 8 9]
eq = (A == B) %返回值为1或0
xy = (A < 5) & (B > 7) %且
xy = (A < 5) | (B > 7) %或
A(A < 3)= 0
A(2, :) = 0
数组操作函数: flipud fliplr rot90
1
2
3
4
A = [1 2 3; 4 5 6; 7 8 9];
B = flipud(A) %up down 上下交换
C = fliplr(A) %left right 左右交换
D = rot90(A) %逆转90度 不是转置
矩阵求和,最大值
1
2
3
4
5
6
7
A = [1 2 3; 4 5 6; 7 8 9];
sum(A) %输出每列的最大值
sum(A,1) %等价于 sum(A) 指的是输出第一维的和,也就是每列的和
sum(A,2) %输出每行的和,行是第二维
max(A) %输出每列的最大值
max(A,2) %这里需要注意了,并不是输出第二维每行的最大值,而是看矩阵得元素同2比较,谁大就取谁。
max(A,[],2) % 这里才是取出第二维每行的最大值

###

Matlab的简单作图

二维曲线图
1
2
3
4
5
6
7
8
9
10
11
12
x = -2*pi:0.1:2*pi;        %指的是x的区间从-2π-2π,0.1为步长,就是每隔0.1画一个点,大的话就不太准确了(亲测)
y1 = sin(x);
y2 = cos(x);
plot(x,y1,'-r'); %画图的重要函数 ''中的-代表实线,r代表red红色,这里面可以写的参数我一会在列举。
hold on %代表保留这个曲线在这,否则再画别的图的时候可能会把这个覆盖
plot(x,y2,'-b');
xlabel('x') %x轴上的标签
ylabel('y') %y轴上的标签
text(0,0,'(0,0)') %为坐标原点加上(0,0)标签
legend('sin x','cos x') %本意是传奇,在这里指的是图例
title('sin x and cos x') %图片的名字
%可以把此代码复制一下,便可直接运行
说说图的曲线可以有哪些格式:

(这样大家就可以随意改动曲线的格式了)

图片

补充内容
1
2
3
4
5
6
grid on      %添加网格图,可以试一下
axis([xmin,xmax,ymin,ymax]) %可以设置x和y轴的坐标的范围
xlim([xmin,xmax]) %只限制x轴的坐标范围,y轴同理
[x,y] = meshgrid(1:3,1:3) %x矩阵为每个方格的一维坐标,即列坐标,下面配上图
rsq = (x - 2).^2 + (y - 2).^2
r = sqrt(rsq) %可以求出每个点到中心点(2,2)方块的距离

图1

三维曲线图举例

高数中刚刚接触的螺旋线。

1
2
3
4
5
6
7
8
9
10
t = 0:pi/50:10*pi;     %10π就是转了5圈
x = sin(t);
y = cos(t);
z = t;
plot3(x,y,z) %三维图像用plot3
title('Helix')
xlabel('sin t')
ylabel('cos t')
zlabel('t')
grid on %可以直接绘制出螺旋图