目录
- 清空环境变量及命令
- 变量命令规则
- MATLAB数据类型
- MATLAB矩阵操作
- MATLAB逻辑与流程控制
- MATLAB基本绘图操作
- MATLAB文件导入
4.MATLAB矩阵操作
4.1矩阵的定义与构造
Matlab可以方便的对矩阵进行运算,以下为几个简单的例子
A = [1 2 3 5 8 5 4 6]
B = 1:2:9 %生成一个行向量(等差数列),公差为2
C = repmat(B, 3, 1) %将B看成整体复制并重新拼接成3行1列的矩阵
D = ones(2, 4) %生成一个2行4列的全1矩阵
运行之后,结果如下:
A =
1 2 3 5 8 5 4 6
B =
1 3 5 7 9
C =
1 3 5 7 9
1 3 5 7 9
1 3 5 7 9
D =
1 1 1 1
1 1 1 1
通过结果应该可以比较容易的理解以上函数的作用,在Matlab中常用的
Matlab函数可以参考Matlab常用函数
4.2矩阵的四则运算
矩阵的基本运算包括矩阵的加法,减法,数乘,转置,共轭和共轭转置
矩阵的加法满足运算律(A,B都是同型矩阵):应该注意的是只有同型矩阵之间才可以进行加法,我们先生成两个简单矩阵A和B
A = [1 2 3 4; 5 6 7 8]
B = [1 1 2 2; 2 2 1 1]
运行后为:
A =
1 2 3 4
5 6 7 8
B =
1 1 2 2
2 2 1 1
这两个矩阵可以进行加减法运算
C = A + B
D = A - B
运行后为
C =
2 3 5 6
7 8 8 9
D =
0 1 1 2
3 4 6 7
即,A和B对应元素相加减即可。矩阵的加减运算都是线性运算。矩阵还可以进行数乘运算,即用一个数n乘以一个矩阵,等于用这个数乘以这个矩阵中的每一个元素,数乘也是线性运算,例如运行3*B
,会得到:
ans =
3 3 6 6
6 6 3 3
矩阵的乘法运算和线性代数的运算规则一样,不是任意两个矩阵都可以相乘,必须满足第一个矩阵的列与第二个矩阵的行相等,即一个m行n列的矩阵与一个n行p列的矩阵可以相乘,得到一个m行p列的矩阵,如A*B'
可以相乘,A为2行4列,B'为4行2列,乘完得到一个2行2列的矩阵:
ans =
17 13
41 37
这里介绍一个Matlab中矩阵的点乘和点除运算,即将两个矩阵的对应元素相乘或相除:
F = A .* B
H = A ./ B
会得到:
F =
1 2 6 8
10 12 7 8
H =
1.0000 2.0000 1.5000 2.0000
2.5000 3.0000 7.0000 8.0000
严格来说,矩阵是不存在除法的,Matlab中对于矩阵相除分为左除\
和右除/
如 G B = A,如果要求矩阵G,即在等式两边的右边同时乘以B的逆(这里B的逆必须存在),变为 G B pinv(B) = A pinv(B),即 G=A * pinv(B)。在这里必须说明一下,Matlab中,对于方阵求逆可以用 inv() 函数来求,而对于一般行列数不等的矩阵,则可以考虑计算矩阵的 Moore-Penrose逆,用 pinv() 来求。在Matlab中,等式两边同时右乘一个矩阵的逆可以用右除来表示即 G = A / B:
G =
1.8333 -0.1667
3.1667 1.1667
运行A * pinv(B)
可以得到与上面一样的结果。
如果A和B都是方阵,Matlab的左除运算可以看成要求 B G = A 的 G,等式两边的左边同时乘以 B 的逆,变为 inv(B) B G = inv(B) A ,即 G = inv(B) * A,用左除表示为 G = B \ A 。
4.3矩阵的下标
A = magic(5) %生成一个5阶magic矩阵
B = A(2,3) %将A矩阵中第2行,第3列的数赋值给B
C = A(3,:) %将A矩阵中的第3行所有列赋给C,即将A的第3行全部元素赋给C
D = A(:,4) %将A矩阵中的第4列所有行赋给D,即将A的第4列所有元素赋给D
[m, n] = find(A > 20) %寻找A中元素数值大于20的元素的位置,并返回索引矩阵
运行后显示:
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
B =
7
C =
4 6 13 20 22
D =
8
14
20
21
2
m =
2
1
5
4
3
n =
1
2
3
4
5
5.MATLAB逻辑与流程控制
与大多数编程语言一样,matlab的逻辑与流程控制的语法与许多高级语言类似。
5.1 if ... else ... end
A = rand(1,10) %生成随机矩阵
limit = 0.75;
B = (A > limit); % B是一个逻辑值
if any(B)
fprintf('Indices of values > %4.2f: \n', limit);
disp(find(B))
else
disp('All values are below the limit.')
end
这是一个选择结构,具体结果大家可以自己去运行一下。
5.3 switch ... case ... end
mynumber = input('Enter a number:');
switch mynumber
case -1
disp('negative one');
case 0
disp('zero');
case 1
disp('positive one');
otherwise
disp('other value');
end
这也是一个选择结构。
5.2 for ... end&while ... end
k = 10;
hilbert = zeros(k,k); %预分配内存给hilbert矩阵
for m = 1:k %从1到k进行循环
for n = 1:k
hilbert(m,n) = 1/(m+n -1);
end
end
hilbert
这是一个循环结构,除了for循环,还有一种while循环,如下:
%求n的阶乘的几种方法
n = 1;
nFactorial = 1;
while nFactorial < 5
n = n + 1;
nFactorial = nFactorial * n; %使用循环进行连乘
end
nFactorial
factorial(5) %使用matlab内置求阶乘的函数
prod(1:5) %使用连乘积函数进行1:5的连乘
运行结果最终都是一样的:
nFactorial =
120
ans =
120
ans =
120
6.MATLAB基本绘图操作
6.1二维平面绘图
x = 0:0.01:2*pi; %生成0到2pi之间间隔为0.01的行向量
y = sin(x); %将x视为自变量,带入到正弦函数中
figure
plot(x, y) %绘制函数图像
title('y = sin(x)') %设置图像的标题
xlabel('x') %设置x轴的标签
ylabel('sin(x)') %设置y轴的标签
xlim([0 2*pi]) %限制x轴的坐标范围
x = 0:0.01:20;
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
figure
[AX,H1,H2] = plotyy(x,y1,x,y2,'plot'); %绘制双y图,返回坐标轴及两个图形的句柄
set(get(AX(1),'Ylabel'),'String','Slow Decay') %get函数得到句柄,set函数设置相关属性,下同
set(get(AX(2),'Ylabel'),'String','Fast Decay')
xlabel('Time (\musec)')
title('Multiple Decay Rates')
set(H1,'LineStyle','--')
set(H2,'LineStyle',':')
绘制的函数图像如下:
6.2三维立体绘图
除了二维绘图,三维图形的绘制与二维图形的绘制方法大同小异。
t = 0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
xlabel('sin(t)')
ylabel('cos(t)')
zlabel('t')
grid on
axis square
6.3图形的保存与导出
保存或导出图形通常有以下几种方法:
- Edit → Copy Figure
- Toolbar → Save
- print('-depsc','-tiff','-r300','picture1')
- File → Export Setup
7.MATLAB文件导入
7.1mat格式
save data.mat x y1 y2
clear all
load data.mat
7.2 txt格式
M = importdata('myfile.txt');
S = M.data;
save 'data.txt' S -ascii
T = load('data.txt');
isequal(S, T)
7. 3 xls格式
xlswrite('data.xls',S)
W = xlsread('data.xls');
isequal(S, W)
xlswrite('data.xlsx',S)
U = xlsread('data.xlsx');
isequal(S, U)
7.4 csv格式
csvwrite('data.csv',S)
V = csvread('data.csv');
isequal(S, V)