文章目录
矩阵取一部分
MATLAB对矩阵的操作十分灵活,下面对最近遇到的进行总结:
说明 ':'
代表取全部,‘,’
代表分界符,‘,’
前面代表行,后面代表列。如果‘,’
前面为‘:’
则行取全部,如果‘,’
后面为':'
,则列取全部。
格式A(m,n),用于提取矩阵A中符合m,n要求的部分
提取某个元素,则m,n为数字标量,如A(2,3)为第二行第三列的元素。
简单的
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、提取某行某列
A(:,n)提取第n列的所有元素,如A(:,3)提取第三列的所有元素;
A(m,:)提取第m行的所有元素,如A(3,:)提取第三行的所有元素;
2、提取任意的某部分并重新组成新的矩阵,连续或不连续,单调或不单调
数字指定: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]*[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
行数列数相等。例如:
>> [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×t
,t.^2
是矩阵中每个元素的平方。PS: 若t
不是方阵,则t^2
会出错
plot画图
plot函数的基本调用格式为:
-
plot(y)
当y
为一向量时,以y
元素的值为纵坐标,y
的元素序号为横坐标值,用直线依次连接数据点,绘制曲线。当y
为一实矩阵时,则以其序号为横坐标,按列绘制每列元素值相对于其序号的曲线, 当y为m×n
矩阵时,就由n
条曲线。 -
plot(x,y)
若y
和x
为同维向量,则以x
为横坐标,y
为纵坐标绘制连线图。若x
是向量,y
是行数或列数与x长度相等的矩阵,则绘制多条不同色彩的连线图,x
被作为这些曲线的共同横坐标。若x
和y
为同型矩阵,则以x,y
对应元素分别绘制曲线,曲线条数等于矩阵列数。 -
plot(x1,y1,x2,y2,……)
在此格式中,每对x,y
必须符合plot(x,y)
中的要求,不同对之间没有影响,命令将对每一对x,y
绘制曲线。
以上三种格式中的x,y
都可以是表达式。plot
是绘制一维曲线的基本函数,但在使用此函数之前,须先定义曲线上每一点的x
以及y
坐标。
例2 生成的图形是上30个点连成的光滑的正弦曲线。
x=linspace(0,2*pi,30); % 生成一组线性等距的数值 其中x1、x2、N分别为起始值、终止值、元素个数。若默认N,默认点数为100。
y=sin(x);
plot(x,y)
注释:
linspace(x1,x2,N)
功能:linspace是Matlab中的均分计算指令,用于产生x1,x2之间的N点行线性的矢量。其中x1、x2、N分别为起始值、终止值、元素个数。若默认N,默认点数为100。
运行结果:
MATLAB中提供的线型属性
需要说明的是,LineSpec中设置曲线线型、标识符和颜色三项属性时,控制符的顺序不受限制并可以省略或者部分省略。也就是说'r-.*'、'-.r*'、'*-.r'等形式是等效的,都表示使用红色点划线连接各个节点,各节点使用“*”标识。
subplot函数
subplot
是将多个图画到一个平面上的工具。Subplot(m, n, p)
其中,m
表示是图排成m
行,n
表示图排成n
列,也就是整个figure中有n个图是排成一行的,一共m行,如果第一个数字是2就是表示2行图。p是指你现在要把曲线画到figure中哪个图上,最后一个如果是1表示是从左到右第一个位置。
plot3
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);
常用画图三联
% 三维坐标
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;
求解二元二次方程
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))
添加噪声
rand
生成均匀分布的伪随机数。分布在(0~1)之间
rand(m,n)
生成m行n列的均匀分布的伪随机数randn
生成标准正态分布的伪随机数(均值为0,方差为1)
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')
矩阵的平方和元素的平方
设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 函数求导 用法以及实例
diff(函数) , 求的一阶导数;
diff(函数, n) , 求的n阶导数(n是具体整数);
diff(函数,变量名), 求对的偏导数;
diff(函数, 变量名,n) ,求对的n阶偏导数;
带入数值 计算函数
参考这篇文章 Matlab subs函数的用法
R = subs(S, new) 利用new的值代替符号表达式S中的默认符号;
R = subs(S) 用由调用函数或Matlab工作空间中获取的值替代了在符号表达式S中的所有当前的变量;
R = subs(S, old, new) 利用new的值代替符号表达式中old的值。old为符号变量或是字符串变量名。
实例
%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
的不同。python
是if
后面加一个":",
然后if
下面缩进,没有与之对应的end
。
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
预算符关系
< 小于
<= 小于或等于
> 大于
>= 大于或等于
== 等于
~= 不等于
for语句
for
后面也不需要":"
直接和对应的end符号
即可
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
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