Matlab Tutorial

文章目录
  1. 1. Basic Operations
  2. 2. Moving Data Around
  3. 3. Computing on Data
  4. 4. Plotting Data
  5. 5. Control statements
  6. 6. Function

Basic Operations

1
2
3
4
5
6
7
8
9
10
11
%% 元素操作
5+6
3-2
5*8
1/2
2^6 % 次方,不是异或
1 == 2 % 假
1 ~= 2 % 真 注意,不是用 "!="
1 && 0
1 || 0
xor(1,0)
1
2
3
4
%% 变量赋值
a = 3; % 加分号就不会立即输出
b = 'hi';
c = 3>=1;
1
2
3
4
5
6
7
8
9
% 显示
a = pi
disp(a)
disp(sprintf('2 decimals: %0.2f', a)) % 类似C中printf
disp(sprintf('6 decimals: %0.6f', a))
format long % 改变显示的格式
a
format short
a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
%%  向量和矩阵
A = [1 2; 3 4; 5 6] % 3x2矩阵

v = [1 2 3] % 行向量
v = [1; 2; 3] % 列向量
v = 1:0.1:2 % 从1到2,步长为0.1
v = 1:6 % 从1到6,默认步长为1

C = 2*ones(2,3) % 等同于 C = [2 2 2; 2 2 2]
w = ones(1,3) % 1x3 的全一向量
w = zeros(1,3) % 1x3 的全零向量
w = rand(1,3) % 1x3矩阵,元素的值在(0,1)之间,产生于均匀分布
w = randn(1,3) % 1x3矩阵,产生于标准正态分布
w = -6 + sqrt(10)*(randn(1,10000));
hist(w) % 绘制直方图,默认10等分
hist(w,50) % 绘制直方图,50等分

I = eye(4) % 4x4 单位矩阵

% help 函数,可以查看每个函数的说明
help eye
help rand
help help

Moving Data Around

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
%% 维数
sz = size(A) % 返回1x2 矩阵: [行数, 列数]
size(A,1) % 行数
size(A,2) % 列数
length(v) % 最长维的大小


%% 加载数据
pwd % 显示当前路径
cd 'C:\Users\ang\Octave files' % 改变目录
ls % 显示当前目录下的文件
load q1y.dat % 也可写成 load('q1y.dat')
load q1x.dat
who % 显示当前工作空间的变量
whos % 显示当前工作空间变量的详细信息
clear q1y % 若没有指定变量名,则清空当前工作空间的全部变量
v = q1x(1:10); % q1x的前10个元素 (按列数下来)
save hello.mat v; % 将变量v的内容保存在hello.mat里
save hello.txt v -ascii; % 以ascii码保存
% fopen, fread, fprintf, fscanf

%% 索引
A(3,2) % (行, 列)
A(2,:) % 得到第二行
% ":" 意味着得到那一维的所有元素
A(:,2) % 得到第二列
A([1 3],:) % 得到第1和第3行的元素

A(:,2) = [10; 11; 12] % 改变第二行的元素
A = [A, [100; 101; 102]]; % 加一列
A(:) % 以列向量的形式展示矩阵A中的所有元素

% 将数据放在一起
A = [1 2; 3 4; 5 6]
B = [11 12; 13 14; 15 16] % 和A同维
C = [A B] % A、B并排
C = [A, B] % A、B并排
C = [A; B] % A、B上下排列

Computing on Data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
%% 初始化变量
A = [1 2;3 4;5 6]
B = [11 12;13 14;15 16]
C = [1 1;2 2]
v = [1;2;3]

%% 矩阵操作
A * C % 矩阵乘法
A .* B % 逐元素相乘
% A .* C or A * B 会得到错误
A .^ 2 % 对A中每个元素都平方
1./v % 对v中每个元素取倒数
% 以下三个函数,对标量、向量、矩阵都适用
log(v)
exp(v)
abs(v)

-v % -1*v

v + ones(length(v), 1)
% v中每个元素都加1,也可写成 v + 1

A' % 矩阵转置

%% 一些有用的函数

% max (or min)
a = [1 15 2 0.5]
val = max(a)
[val,ind] = max(a) % 返回最大的元素,及其第一次出现的下标
val = max(A) % 返回矩阵A中每列的最大值

% 比较
a < 3 % 检查a是否小于3
find(a < 3) % 找出a中所有小于3的位置, 按列数
A = magic(3) % 生成3阶幻方
[r,c] = find(A>=7) % 返回A>=7的元素的横纵坐标

% sum, prod
sum(a) % 按列求和
prod(a) % 按列求积
floor(a)% 向下取整
ceil(a) % 向上取整
max(rand(3),rand(3)) % 逐元素比较大小
max(A,[],1) % 返回矩阵A中每列的最大值, 等于max(A)
max(A,[],2) % 返回矩阵A中每行的最大值
A = magic(9)
sum(A,1) % 按列求和
sum(A,2) % 按行求和
sum(sum( A .* eye(9) )) % 主对角线求和
sum(sum( A .* flipud(eye(9)) )) % 副对角线求和


% 矩阵伪逆 (pseudo-inverse)
pinv(A) % 等于inv(A'*A)*A'

Plotting Data

1
2
3
4
%% 绘图
t = [0:0.01:0.98];
y1 = sin(2*pi*4*t);
plot(t,y1); % 见pic1

pic1

1
2
3
y2 = cos(2*pi*4*t);
hold on; % 保持当前图像,"hold off"关闭
plot(t,y2,'r'); % 见pic2

pic2

1
2
3
4
5
xlabel('time'); % 横轴标识符
ylabel('value'); % 纵轴标识符
legend('sin','cos'); % 图例
title('my plot'); % 标题
% 见pic3

pic3

1
2
print -dpng 'myPlot.png' % 保存当前图片
close; % 关闭当前图片

1
2
3
4
5
figure(1); plot(t, y1); % 在figure1中绘制图像
figure(2); plot(t, y2); % 在figure2中绘制图像
figure(2), clf; % 清空figure2中的图像
subplot(1,2,1); % 创建 1x2 的子图, 并访问第一个子图
plot(t,y1); % 图像绘制在第一个子图上,见pic4

pic4

1
2
3
subplot(1,2,2);  % 创建 1x2 的子图, 并访问第二个子图
plot(t,y2); % 图像绘制在第二个子图上,见pic5
axis([0.5 1 -1 1]); % 改变坐标轴范围

pic5

1
2
3
%% 将矩阵以图像显示,见pic6
figure;
imagesc(magic(15)), colorbar, colormap gray;

pic6

Control statements

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
% for 循环
v = zeros(10,1);
for i = 1:10
v(i) = 2^i;
end;

% while 循环
i = 1;
while i <= 5
v(i) = 100;
i = i+1;
end

% break、continue
i = 1;
while true,
v(i) = 999;
i = i+1;
if i == 6,
break;
end;
end

% if-else 语句
if v(1)==1,
disp('The value is one!');
elseif v(1)==2,
disp('The value is two!');
else
disp('The value is not one or two!');
end

Function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function [输出实参表] = 函数名(输入实参数)
注释部分
函数体语句
end

定义:
% foo.m
function [x, y] = foo(a, b)
x = a + b;
y = a - b;
end

调用:
>> a = 1, b = 2;
>> [x, y] = foo(a, b)
x =
3
y =
-1
分享到 评论