Matlab基础篇
Matlab
目录
Matlab
基本语法
分号使用:在命令行输入
3 + 2
会输出:
5
在matlab语句后面加上’;',可以不显示运行结果。
3 + 2;
注释:ctrl + r ,也可以直接输入’%‘。取消注释使用ctrl + t,也可以直接删除’%'。不同的是快捷键可以对多行进行操作。
% 不加分号会显示输出
3 + 2
% 加分号不会进行直接输出,注意是英文分号
3 + 2;
字符串与字符数组
matlab字符串使用双引号引起来,使用单引号引起来的是字符数组。如:
s = "world!";
t = 'matlab'; % t不是一个字符串,而是一个包含六个字符的字符数组
字符串与字符串,字符串与字符数组之间支持拼接操作,使用+:
t = 'Hello ' + s;
拼接结果会强制转换为字符串,且字符数组与字符数组不可以通过‘+’拼接
字符数组,可以简单看作是一个向量全部存放字符串。注意:要想生成字符串数组,则向量中必须包含有双引号引起来的字符串。否则会拼接为一个字符串。
a = ['hello', " ", 'world!']
b = ['hello', ' ', 'world!'] % 字符数组的拼接,后面会讲
a =
1×3 string 数组
"hello" " " "world!"
b =
'hello world!'
等差数列
matlab生成等差数列:变量名 = 首项 : 公差 : 最大数字范围
a = 1:10:100
输出:
a =
1 11 21 31 41 51 61 71 81 91
等差数列生成,省略公差时默认公差为1:
a = 1:10 % 输出1 2 3 4 5 6 7 8 9 10
向量
向量使用[]括起来,可以使用,或者 进行分隔。
a = [1, 2, 3]
a = [1 2 3]
当使用;分隔向量元素时,表示使用分号进行了隔行,即被分隔的元素属于同一行。
a = [1;2;3] % 表示3行列向量
输出:
a =
1
2
3
总结:同行元素使用,或 隔开, 不同行元素使用;隔开。
矩阵
矩阵是由许多向量构成的。
A = [1 2 7; 3 4 8; 5 6 9];
输出:
A =
1 2 7
3 4 8
5 6 9
matlab矩阵中的元素是按照列进行存储的:使用矩阵名(:)获取矩阵所有元素:
A(:)
输出:
ans =
1
3
5
2
4
6
7
8
9
matlab中得到矩阵中指定位置的元素,类似于C语言的索引。不同的是,矩阵的下标默认从1开始。如:
A(1, 1) % 输出 1
提取某一行所有元素:A(x, :)
A(1, :) % 提取第一行所有元素
提取某一列所有元素:A(:, y)
A(:, 1) % 提取第一列所有元素
特殊的,提取最后一行或最后一列的元素,且不清楚矩阵有多少行或列时可以使用end
A(end, :) % 提取最后一行所有元素
A(:, end) % 提取最后一列所有元素
提取某一行或列后可以进行赋值:
A(:, 2) = [1;2;3]; % 使用行向量会得到相同结果
A
输出:
A =
1 1 7
3 2 8
5 3 9
提取某些行所有元素:
1.A([x1,x2...xn], :)
A([1, 3], :) % 取1,3行所有元素
2.A(s:e, :)
A(1:3, :) % 取1-3行所有元素,利用了省略公差的等差数列生成式
提取某些列所有元素:
1.A(:, [y1,y2...yn])
A(:, [1, 3]) % 取1,3列所有元素
2.A(:, s:e)
A(:, 1:3) % 取1-3列所有元素,利用了省略公差的等差数列生成式
注意完整书写公差的格式仍然是支持的且公差可以为负值,例如:
A(3:-1:1, :) % 取3-1行所有元素
输出:
ans =
5 6 9
3 4 8
1 2 7
矩阵转置操作:A(end:-1:1, end:-1:1),matlab提供了更为方便矩阵转置操作:A'
关系运算符
常见关系运算符有:>, <, ==, >=, <=, ~=(不等于,不同于C语言的!)等
矩阵或向量与常数进行关系运算时,相当于矩阵或常数中每一个元素与常数作元素。并返回一个相同规格的逻辑数组(分别作比较后的逻辑值):
A = [1, 0, 2, 3, 5, 7];
A > 0
A = [1 2 3;3 2 1;4 5 6];
A > 2
输出:
ans =
1×6 logical 数组
1 0 1 1 1 1
ans =
3×3 logical 数组
0 0 1
1 0 0
1 1 1
分支语句
分支语句语法:
if 逻辑表达式1
代码1
elseif 逻辑表达式2
代码2
else
代码3
end % matlab分支语句结尾必须要有end
一个小例子:
score = input('请输入考试成绩:') % input()输入函数
if score >= 80
disp('成绩优秀') % disp()输出函数
elseif score >= 60
disp('成绩及格')
else
disp('不及格')
end
循环语句
循环语句语法:
% 步长为正表示i不能大于n,否则表示i不能小于n。
for i = 初始值 : 步长: n
代码块
end
':'分隔的三个区域表示: i:初始值。步长:i每次增长量,注意:可以为负。n:i的值不能大于或小于n具体因步长正负而定(步长为正表示i不能大于n,否则表示i不能小于n。),注意:可以相等。
一个小例子:
for i=1: 9
A = [];
for j=1: i
A = [A, j]; % 向量追加
end
disp(A);
end
输出:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
常见操作及内置函数
1.clear和clc
在屏幕右侧有一个工作区,可以监测代码运行过程中的变量。使用clear命令可以清空工作区。
当命令行输入太多时可以使用clc命令清空命令行文本。
通常情况下,clear;clc一起使用。此处,';'起到分隔语句的作用。
2.输入输出函数(disp() 和 input() )disp()输出函数
disp('hello world!') % 输出hello world!
input() 输入函数。将输入的数字、向量、字符串或矩阵赋值给一个变量:
A = input('请输入一个变量:')
请输入一个变量:[1 2;3 4]
A =
1 2
3 4
3.字符串拼接strcat()strcat(s1, s2...sn)
strcat('hello', ' ', 'world!')
也可以使用行向量自动拼接字符串:
a = ['hello', ' ', 'world']
输出:
hello world!
注意:使用第二种方式进行字符串输出时(使用disp() ),如果出现了使用""引起来的字符串则输出的每一个字符串都会带""。例如:
disp(['hello', " ", 'world!'])
disp(['hello', ' ', 'world!'])
输出:
"hello" " " "world!"
hello world!
因为此时你生成了一个字符数组:
a = ['hello', " ", 'world!']
a =
1×3 string 数组
"hello" " " "world!"
4.将数字转化为字符串num2str()
a = 100;
num2str(a) % 工作区 ans = '100'
num2str()通常用来对结果进行格式化输出,例如
a = 100;
% num2str()通常用来输出结果
disp(strcat('最后结果为:', num2str(a)));
disp(['最后结果为:' num2str(a)]); % 使用行向量自动拼接字符串
5.求和函数sum(), max(),min(),prod()
直接对向量求和时会直接对所有元素求和。例如:
% 向量直接求和
A = [1, 2, 3, 4];
sum(A)
A = [1; 2; 3; 4];
sum(A)
输出
10
直接对矩阵求和时,会对每一列求和得到一个行向量。例如:
A = [1 2; 3 4; 5 6];
% 直接对矩阵求和会对每一列求和得到一个行向量
sum(A)
输出:
9 12
sum()函数其实拥有两个参数,第二个参数dim表示维度。其默认值为1会对每一列进行求和,当手动输入2时会对每一行进行求和得当一个列向量。例如:
A = [1 2; 3 4; 5 6];
% dim为2时会对每一行求和得到一个列向量
sum(A, 2)
输出:
3
7
11
想要对矩阵所有元素求和可以使用sum(矩阵名(:))例如:
A = [1 2; 3 4; 5 6];
% 全部求和
sum(A(:)) % 输出21
另外三个函数,返回最大值max(),返回最小值min(),返回连乘结果prod()。
用法和sum()基本相同。但是当max()或min()要更换维度时,需要用[]占位。
max(A, [], dim) % dim:1为按列求得到行向量,2为按行求得到列向量
6.size()函数
与sum()函数类似,size()也有第二个参数dim。当dim等于1时返回行数,等于2时返回列数:
A = [1 3 2;
9 8 7;
6 4 5;
7 8 9];
size(A, 1) % dim = 1
输出:
ans =
4
返回对应向量或矩阵的行数和列数,此时使用使用行向量来接收结果,如:
A = [1 2 3;4 5 6];
[r, c] = size(A)
输出:
r = 2
c = 3
也可以通过传入额外的参数得到行或列:
A = [1 2 3;4 5 6];
r = size(A, 1) % 默认参数为1时只返回行数
c = size(A, 2) % 默认参数为2时只返回列数
输出:
r = 2
c = 3
7.repmat()函数repmat(矩阵或向量名,m行, n列) 表示以矩阵或向量为基本元素构成一个m行n列的大矩阵。例如:
ans =
1 2 3
4 5 6
1 2 3
4 5 6
ans =
1 2 3 1 2 3
4 5 6 4 5 6
1 2 3 1 2 3
4 5 6 4 5 6
1 2 3 1 2 3
4 5 6 4 5 6
8.矩阵运算
矩阵对应元素相加+、相减-、相乘.*,相除./和乘方.^ K
A = [1,2;3 4];
B = [1 2;2 1];
A + B
A - B
A .* 2
A .* B
A ./ B
A .^ 2
输出结果:
% A + B
ans =
2 4
5 5
% A - B
ans =
0 0
1 3
% A .* 2 对应元素乘2
ans =
2 4
6 8
% A .* B
ans =
1 4
6 4
% A ./ B
ans =
1.0000 1.0000
1.5000 4.0000
% A .^ 2 对应元素平方
矩阵相乘,只有第一个矩阵的行数等于第二个矩阵的列数时,两个矩阵才可以进行乘法运算X。例如:
A = [1,2;3 4];
B = [1 0;0 1];
A * B
输出:
ans =
1 2
3 4
矩阵除法,inv()函数返回对应矩阵的逆矩阵。矩阵除法等价形式A/B <==> A * inv(B):
A = [1,2;3 4];
B = [1 0;0 1];
B * inv(A)
B / A
二者输出相同,均为:
ans =
-2.0000 1.0000
1.5000 -0.5000
方阵乘方,即A * A * A…*A。使用A ^ k表示方阵叉乘k次:
A ^ 3
输出:
% A * A * A
ans =
37 54
81 118
9.求矩阵的特征值和特征向量:eig()
求解矩阵的全部特征值构成向量E:
A = [1 2 3; 2 2 1; 2 0 3]
E = eig(A)
输出:
E =
-1.3166
5.3166
2.0000
求矩阵A的全部特征值构成对角阵D,并求矩阵的特征向量构成V的列向量。其中V的每一列都是D中与之相同列的特征值的特征向量。
A = [1 2 3; 2 2 1; 2 0 3]
[V, D] = eig(A)
输出:
% V的每一列都是D中与之相同列的特征值的特征向量
V =
0.8364 -0.6336 -0.2408
-0.3875 -0.5470 -0.8427
-0.3875 -0.5470 0.4815
D =
-1.3166 0 0
0 5.3166 0
0 0 2.0000
10.sort()函数
sort()函数会对矩阵进行排序,返回排序后的矩阵。注意,排序是在拷贝矩阵上进行的,并不会影响原矩阵。
与sum()函数类似,sort也有第二个参数dim。当dim等于1时,返回按列排序的矩阵;dim等于2时返回按行排序的结果:
sort(A, 2)
sort()改变排序规则:sort(矩阵名, 'descend')。此时,若想按列排序,参数顺序应该为:sort(矩阵名, dim, 'descend')
sort(A, 'descend')
输出:
ans =
9 8 9
7 8 7
6 4 5
1 3 2
sort()返回排序前下标:[排序后矩阵, 排序后的元素原始下标] = sort(矩阵名):
A = [1 3 2;
9 8 7;
6 4 5;
7 8 9];
[B, ind] = sort(A)
输出:
B =
1 3 2
6 4 5
7 8 7
9 8 9
ind =
1 1 1
3 3 3
4 2 2
2 4 4
10.find()函数
find()函数有多种用法最常见的用法是:返回矩阵或向量中非零元素的索引。
注意:返回矩阵中的非零元素索引时会先将矩阵按列排布后返回非零元素的下标。
向量:
A = [1, 0, 2, 3, 5, 7];
find(A) % 输出 1 3 4 5 6
矩阵:
% 对矩阵直接进行find()会先将矩阵按列排布后返回非零元素的下标
A = [0 2 3; 2 2 1; 2 0 3];
find(A)
矩阵对应输出:
ans =
2
3
4
5
7
8
9
可以使用如下方式接收find()的返回值,从而得到矩阵的行列索引:
% 使用包含两个元素的向量接收find()的返回值,分别得到矩阵的行列索引
A = [0 2 3; 2 2 1; 2 0 3];
[r, c] = find(A)
输出:
% 可以观察到寻找的方式仍然是按照列来进行的
r =
2
3
1
2
1
2
3
c =
1
1
2
2
3
3
3
find()函数可以指定返回前k个非零元素的下标,只要传递第二个参数k即可。find(矩阵或向量名, k)。例如:
% 使用包含两个元素的向量接收find()的返回值,分别得到矩阵的行列索引
A = [0 2 3; 2 2 1; 2 0 3];
[r, c] = find(A, 2)
输出:
r =
2
3
c =
1
1
11.rand()函数
rand()函数用于生成随机数,范围为[0, 1]。
1.rand(n, m)生成范围为[0, 1]的n行m列矩阵:
>> rand(3, 4)
ans =
0.8147 0.9134 0.2785 0.9649
0.9058 0.6324 0.5469 0.1576
0.1270 0.0975 0.9575 0.9706
2.rand(n)生成范围为[0, 1]的n行n列方阵:
>> rand(3)
ans =
0.9572 0.1419 0.7922
0.4854 0.4218 0.9595
0.8003 0.9157 0.6557
12.unifrnd()函数unifrnd(a, b, n, m)生成范围为[a, b]的n行m列的随机数:
>> unifrnd(3, 4, 15, 1)
ans =
3.6948
3.3171
3.9502
3.0344
3.4387
3.3816
3.7655
3.7952
3.1869
3.4898
3.4456
3.6463
3.7094
3.7547
3.2760
自定义函数
Matlab中函数必须定义在另外的一个m文件中,不可以与主函数放在同一个m文件中。
函数基本格式:
function [返回变量] = 函数名(输入数据)
函数代码块
end
例如:
% func.m
function [a, b, c] = func(d, e)
a = d + e;
b = d - e;
c = d * e;
end
% 主函数.m
[a, b, c] = func(2, 3)
输出:
a =
5
b =
-1
c =
6
基本作图
1.plot()
matlab可以使用plot()绘制一般图像,需要提供参数包括:x坐标向量,y坐标向量以及图线方式。
例如:
% x从-pi到pi公差为1的等差数列
x = -pi : pi;
% 对每一个x计算y值
y = sin(x);
% 作图 参数依次为x坐标y坐标以及图线方式
plot(x, y, '-');
作图效果:
2.坐标、图例以及主题
plot()函数可以接收多组参数并进行绘图,使用legend()函数可以依次对每一个图线添加图例。
1.使用函数legend(‘string’)为图像添加图例,如下可按顺序为多个图添加图例:
x = -pi : pi;
y = sin(x);
plot(x, y, '-', x, y, 'rx');
% 为图一图二添加图例
legend('曲线','样本点');
绘图效果:
2.使用函数xlabel(‘string’),ylabel(‘string’)为图像添加横纵坐标:
x = -pi : pi;
y = sin(x);
% 为图像添加坐标
plot(x, y, '-');
xlabel('x坐标');
ylabel('y坐标');

3.最后使用title(‘string’)为图像添加主题:
x = -pi : pi;
y = sin(x);
plot(x, y, '-');
xlabel('x坐标');
ylabel('y坐标');
% 为图像添加主题
title('sin(x)图像');

3.x, y坐标取值范围
使用axis([X0, Xn, Y0, Yn])分别设置x范围为:[X0, Xn],y范围为:[Y0, Yn](注意axis函数参数为一个行向量):
4.图线方式
图线绘制有两种方式,图线可以使用线连起来也可以使用点进行标记。
线方式:-实线(默认值) :虚点线 -.点画线 --虚线
例如虚线:
plot(x, y, '--');

点方式:.圆点 +加号 *星号 xx型 o小圈
例如x型:
plot(x, y, 'x');

在此基础上还可以设置颜色:y黄色 r红色 g绿色 b蓝色 w白色 k黑色 m紫色 c青色
红色点画线:
plot(x, y, 'r-.');

5.多张图像
当直接绘制多张图像时,只能得到最后一张图,因为最后一张图覆盖了之前的图。
可以使用figure()分页绘制多张图像:
% figure(x) x参数表示在画第几张图
figure(1);
plot(x, y, 'r-.');
legend('图一');
figure(2);
plot(x, y, 'm--');
legend('图二');

更多推荐


所有评论(0)