matlab 常用指令

文章目录

      • 矩阵取一部分
      • 矩阵乘法 除法 点乘 点除
        • `*`和`.*`的联系和区别。
        • `/`和`./`的联系和区别。
      • 矩阵的平方
      • plot画图
        • subplot函数
        • plot3
        • 常用画图三联
      • 求解二元二次方程
      • 添加噪声
      • 矩阵的平方和元素的平方
      • 矩阵行列计数
      • 函数求导
        • 求导
        • 带入数值 计算函数
        • 实例
      • if语句
      • for语句
      • 注意细节
        • atan和atan2的区别

矩阵取一部分

MATLAB对矩阵的操作十分灵活,下面对最近遇到的进行总结:

说明 ':'代表取全部,‘,’代表分界符,‘,’前面代表行,后面代表列。如果‘,’前面为‘:’则行取全部,如果‘,’后面为':',则列取全部。

1
2
格式A(m,n),用于提取矩阵A中符合m,n要求的部分
提取某个元素,则m,n为数字标量,如A(2,3)为第二行第三列的元素。

简单的

1
2
3
4
5
6
7
8
9
1.提取大矩阵的一列、一行元素:
一列元素:  A(:,j)表示提取A矩阵的第j列全部元素
一行元素:  A(i,:)表示提取A矩阵的第i行元素,
于是我们有,A(i, j)表示提取A矩阵的第i行第j列的元素。

2.提取多行多列元素
多行元素:  A(i:i+m,:)表示提取A的第i行到第i+m行的元素。
多列元素:  A(:,j:j+n)表示提取A的第j列到第j+n列的元素。
提取块:     A(i:i+m, j:j+n)表示的是mxn的一个子块的元素。

1、提取某行某列

1
2
3
  A(:,n)提取第n列的所有元素,如A(:,3)提取第三列的所有元素;

  A(m,:)提取第m行的所有元素,如A(3,:)提取第三行的所有元素;

2、提取任意的某部分并重新组成新的矩阵,连续或不连续,单调或不单调

1
2
3
4
5
6
7
 数字指定:A([1 2 3 4],[2 3]) 返回1 2 3 4行2 3 列的数据;

 步长指定:A(1:2:end,:) A(2:2:end,:)分别提取矩阵A的奇数行和偶数行数据;

                 A(end:-1:1,:) A(:,end:-1:1)分别返回A矩阵行倒序和列倒序的矩阵

 变量指定:A(B(:,1),:),其中B的第一列含有数据,用来指定取矩阵A的哪些行。

矩阵乘法 除法 点乘 点除

*.*的联系和区别。

1,在进行数值运行和数值乘矩阵,这两种没有区别,例如:a*b=a.*b; a*B=a.*B; B*a=B.*a(其中小写字母表示数值,大写字母表示矩阵,下同)。
  2,在处理矩阵乘矩阵时,*表示普通的矩阵乘法,要求前面矩阵的列数等于后面矩阵的行数;.*表示两个矩阵对应元素相乘,要求两个矩阵行数列数都相等。例如:

1
2
3
4
5
6
7
>> [1,2,3]*[1,2;3,4;5,6]       % 矩阵乘法
>> ans =
>>     22    28

>> [1,2,3].*[4,5,6]            % 矩阵点乘
>> ans =
>>      4    10    18

/./的联系和区别。

1,数值运行时,这两种没有区别,例如:a/b=a./b
  2,数值与矩阵运行时,要分数值在前还是在后。
    (1),数值在前,只能用./
    (2),数值在后,这两种一样:A/b=A./b
  3,矩阵除矩阵,A/B可粗略地看作A*inv(B)(强烈不建议进行求逆运算);A./B表示A矩阵与B矩阵对应元素相除,所以要求A,B行数列数相等。例如:

1
2
3
4
5
6
7
>> [4,5]/[1,2;3,4]                    % 矩阵除法
>> ans =
>>    -0.5000    1.5000

>> [4,5,6]./[1,2,3]                   % 矩阵点除
>> ans =
>>     4.0000    2.5000    2.0000

矩阵的平方

t^2是矩阵平方,即t×tt.^2是矩阵中每个元素的平方。PS: 若t不是方阵,则t^2会出错

plot画图

plot函数的基本调用格式为:

  1. plot(y)
    y为一向量时,以y元素的值为纵坐标,y的元素序号为横坐标值,用直线依次连接数据点,绘制曲线。当y为一实矩阵时,则以其序号为横坐标,按列绘制每列元素值相对于其序号的曲线, 当y为m×n矩阵时,就由n条曲线。

  2. plot(x,y)
    yx为同维向量,则以x为横坐标,y为纵坐标绘制连线图。若x是向量,y是行数或列数与x长度相等的矩阵,则绘制多条不同色彩的连线图,x被作为这些曲线的共同横坐标。若xy为同型矩阵,则以x,y对应元素分别绘制曲线,曲线条数等于矩阵列数。

  3. plot(x1,y1,x2,y2,……)
    在此格式中,每对x,y必须符合plot(x,y)中的要求,不同对之间没有影响,命令将对每一对x,y绘制曲线。
    以上三种格式中的x,y都可以是表达式。plot是绘制一维曲线的基本函数,但在使用此函数之前,须先定义曲线上每一点的x以及y坐标。

例2 生成的图形是上30个点连成的光滑的正弦曲线。

1
2
3
x=linspace(0,2*pi,30); % 生成一组线性等距的数值 其中x1、x2、N分别为起始值、终止值、元素个数。若默认N,默认点数为100。
y=sin(x);
plot(x,y)

注释:

1
2
linspace(x1,x2,N)
功能:linspace是Matlab中的均分计算指令,用于产生x1,x2之间的N点行线性的矢量。其中x1、x2、N分别为起始值、终止值、元素个数。若默认N,默认点数为100。

运行结果:

在这里插入图片描述

在这里插入图片描述

MATLAB中提供的线型属性

在这里插入图片描述

1
    需要说明的是,LineSpec中设置曲线线型、标识符和颜色三项属性时,控制符的顺序不受限制并可以省略或者部分省略。也就是说'r-.*'、'-.r*'、'*-.r'等形式是等效的,都表示使用红色点划线连接各个节点,各节点使用“*”标识。

subplot函数

? subplot是将多个图画到一个平面上的工具。Subplot(m, n, p)其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,如果第一个数字是2就是表示2行图。p是指你现在要把曲线画到figure中哪个图上,最后一个如果是1表示是从左到右第一个位置。

plot3

1
2
3
4
5
6
7
t=[0:0.2:10*pi];
x=2*t;
y=sin(t);
z=cos(t);
plot3(x,y,z,'bo');
hold on
plot3(x,y,z,'r-','LineWidth',2);

常用画图三联

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
% 三维坐标
figure;
plot3(measure_Z(1,1:length(t_1)),measure_Z(2,1:length(t_1)),measure_Z(3,1:length(t_1)),'r-','LineWidth',1);
hold on;
plot3(measure_Z(1,length(t_1):end),measure_Z(2,length(t_1):end),measure_Z(3,length(t_1):end),'r-','LineWidth',1);
hold on;
plot3(ENU_X,ENU_Y,ENU_Z,'g-','LineWidth',1);
hold on;
plot3(noise_ENU_X,noise_ENU_Y,noise_ENU_Z,'b-','LineWidth',1);
xlabel('x运动距离 m');
ylabel('y运动距离 m');
zlabel('z运动距离 m');
title('东北天坐标系')
legend('origin CV','origin CA','estimate','noise')


% 三个轴的每一个坐标
figure;
plot(measure_Z(1,:),'r-','LineWidth',1);
hold on;
plot(noise_ENU_X,'b-','LineWidth',1);
hold on;
plot(ENU_X,'g','LineWidth',1);
grid;
set(gca,'xtick',[0:50:length(D)],'xticklabel',[0:50:length(D)]*T);
xlabel('时间/s');
ylabel('运动距离 m');
title('X轴东北天坐标系')
legend('origin ',' noise ','estimate')

figure;
plot(measure_Z(2,:),'r-','LineWidth',1);
hold on;
plot(noise_ENU_Y,'b-','LineWidth',1);
hold on;
plot(ENU_Y,'g','LineWidth',1);
grid;
set(gca,'xtick',[0:50:length(D)],'xticklabel',[0:50:length(D)]*T);
xlabel('时间/s');
ylabel('运动距离 m');
title('Y轴东北天坐标系')
legend('origin ',' noise ','estimate')


figure;
plot(measure_Z(3,:),'r-','LineWidth',1);
hold on;
plot(noise_ENU_Z,'b-','LineWidth',1);
hold on;
plot(ENU_Z,'g','LineWidth',1);
grid;
set(gca,'xtick',[0:50:length(D)],'xticklabel',[0:50:length(D)]*T);
xlabel('时间/s');
ylabel('运动距离 m');
title('Z轴东北天坐标系')
legend('origin ',' noise ','estimate')
--------------------------------------------
 figure;
 subplot(3,1,1)
 plot(estimate_error_X,'g-','LineWidth',1);
 hold on;
 plot(noise_error_X,'b-','LineWidth',1);
 set(gca,'xtick',[0:50:length(D)],'xticklabel',[0:50:length(D)]*T); %xtick就是你要版在哪些地方显示刻度,权xticklabel就是显示什么
 legend('estimate error','noise error');
 xlabel('时间/s');
 ylabel('距离 m');
 title('瞄准线坐标系X轴位置误差')
 grid;
 subplot(3,1,2)
 plot(estimate_error_Y,'g-','LineWidth',2);
 hold on;
 plot(noise_error_Y,'b-','LineWidth',1);
 set(gca,'xtick',[0:50:length(D)],'xticklabel',[0:50:length(D)]*T);
 legend('estimate error','noise error');
 xlabel('时间/s');
 ylabel('距离 m');
 title('瞄准线坐标系Y轴位置误差')
 grid;
 subplot(3,1,3)
 plot(estimate_error_Z,'g-','LineWidth',1);
 hold on;
 plot(noise_error_Z,'b-','LineWidth',1);
 set(gca,'xtick',[0:50:length(D)],'xticklabel',[0:50:length(D)]*T);
 legend('estimate error','noise error');
 xlabel('时间/s');
 ylabel('距离 m');
 title('瞄准线坐标系Z轴位置误差')
 grid;

求解二元二次方程

1
2
3
4
5
6
7
8
9
10
D=10000;%初始距离
theta=pi/6;%角度30°

%求出初始位置 x_0 ,y_0
syms x y;
eq1=x^2+y^2==D*D;%观测距离方程
eq2=tan(theta)*x+route_shortcut/cos(theta)==y;%直线方程
[X,Y]=solve(eq1,eq2,x,y);%会得出来两个值,我们取大于0的
x_0=double(X(1))
y_0=double(Y(1))

添加噪声

  1. rand生成均匀分布的伪随机数。分布在(0~1)之间
    rand(m,n)生成m行n列的均匀分布的伪随机数
  2. randn生成标准正态分布的伪随机数(均值为0,方差为1)
1
2
3
4
5
6
7
8
y=2+3*randn(2,2)%产生一个均值为2,标准差为3的正态分布,方差为9
---------------------------
t=0:0.001:1;
y1=(pi/2)*cos(2*pi*t)+(pi/64)*cos(pi*t/8+pi/3);

temp=y1+0.02*rand(size(y1));

plot(t,y1,t,temp,'r')

矩阵的平方和元素的平方

1
2
3
4
5
6
7
8
9
10
11
12
设t = [2 4;  
    4 2]
>> t.^2  %t.^2是矩阵中每个元素的平方
   ans = 
   4 16
   4 16

>> t^2   %t^2是矩阵平方
  ans =
   12 24
   12 24 
  

可见t^2 是矩阵平方,t.^2是矩阵中每个元素的平方。
   PS: 若t不是方阵,则t^2会出错

矩阵行列计数

(1)size,获取数组的行数和列数
(2)length,数组长度,即行数和列数中的较大值,相当于max(size(a))
(3)numel,返回元素总数

函数求导

求导

参考 这篇文章 MATLAB 函数求导 用法以及实例

1
2
3
4
diff(函数) , 求的一阶导数;
diff(函数, n) , 求的n阶导数(n是具体整数);
diff(函数,变量名), 求对的偏导数;
diff(函数, 变量名,n) ,求对的n阶偏导数;

带入数值 计算函数

参考这篇文章 Matlab subs函数的用法

1
2
3
R = subs(S, new) 利用new的值代替符号表达式S中的默认符号;
R = subs(S) 用由调用函数或Matlab工作空间中获取的值替代了在符号表达式S中的所有当前的变量;
R = subs(S, old, new) 利用new的值代替符号表达式中old的值。old为符号变量或是字符串变量名。

实例

1
2
3
4
5
6
7
%D求导 diff_D
syms t;
f(t)=sqrt((x_0-v_0*cos(theta)*t)^2+(y_0-v_0*sin(theta)*t)^2 +z_0^2 );%D的表达式
diff_f=diff(f(t));%D的倒数表达式
% pretty(diff_f)%将当前变量显示为我们常用的书面形式
diff_d_1=subs(diff_f,t,[0:T:15]);%计算出每个时刻的倒数具体值,类型为sym
diff_D_1=double(diff_d_1);%转换类型sym为double

if语句

if后面并不需要":"直接和对应的end符号即可,这一点和python的不同。pythonif后面加一个":",然后if下面缩进,没有与之对应的end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if expression
    statements
end

-----------------------------------
if expression1
    statements1
elseif expression2
    statements2
else
    statements3
end
-----------------------------
x = input('请输入 x=');
if x ~= 0
    y = sin(x)/x;
else
    y = 1;
end
y

预算符关系

1
2
3
4
5
6
<    小于
<=  小于或等于
>        大于
>=      大于或等于
==      等于
~=      不等于

for语句

for后面也不需要":"直接和对应的end符号即可

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
for index = values
   <program statements>
            ...
end

-----------------------------------
for a = 10:20
   fprintf('value of a: %d\n', a);
end

value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
value of a: 20/

-----------------------------------
for a = 1.0: -0.1: 0.0
   disp(a)
end

 1
 0.90000
 0.80000
 0.70000
 0.60000
 0.50000
 0.40000
 0.30000
 0.20000
 0.10000
 0
 -----------------------------------
for a = [24,18,17,23,28]
   disp(a)
end

24
18
17
23
28

注意细节

atan和atan2的区别

举个例子,a = 1, b = -1,则atan(a/b) = atan(-1) = -pi/4, 而 atan2(a,b) = 3*pi/4

1
2
3
4
5
6
7
8
9
10
atan2(a,b)是4象限反正切,它的取值不仅取决于正切值a/b,还取决于点 (b, a) 落入哪个象限
  当点(b, a) 落入第一象限时,atan2(a,b)的范围是  0 ~ pi/2;
 当点(b, a) 落入第二象限时,atan2(a,b)的范围是  pi/2 ~ pi;
  当点(b, a) 落入第三象限时,atan2(a,b)的范围是  -pi/2~0;
 当点(b, a) 落入第四象限时,atan2(a,b)的范围是 -pi~-pi/2


而 atan(a/b) 仅仅根据正切值为a/b求出对应的角度 (可以看作仅仅是2象限反正切)
   当 a/b > 0 时,atan(a/b)取值范围是 0 ~ pi/2;
   当 a/b < 0 时,atan(a/b)取值范围是 -pi/2~0