文章目录
- 矩阵取一部分
- 矩阵乘法 除法 点乘 点除
- `*`和`.*`的联系和区别。
- `/`和`./`的联系和区别。
- 矩阵的平方
- 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,在进行数值运行和数值乘矩阵,这两种没有区别,例如:
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,数值运行时,这两种没有区别,例如:
2,数值与矩阵运行时,要分数值在前还是在后。
(1),数值在前,只能用
(2),数值在后,这两种一样:
3,矩阵除矩阵,
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 |
矩阵的平方
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个点连成的光滑的正弦曲线。
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函数
?
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)) |
添加噪声
rand 生成均匀分布的伪随机数。分布在(0~1)之间
rand(m,n) 生成m行n列的均匀分布的伪随机数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 |
可见
PS: 若
矩阵行列计数
(1)
(2)
(3)
函数求导
求导
参考 这篇文章 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语句
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语句
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的区别
举个例子,
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 |