【编程语言】Matlab学习记录
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【编程语⾔】Matlab学习记录
Matlab
MATLAB是⼀种语法简单⽤途⼴泛的编程语⾔,既可以⽤于编写脚本,函数,也可以⽤于⾯向对象的程序开发或开发GUI界⾯。
MATLAB被⼴泛应⽤于数值计算,图像处理,机器学习等领域。
⾼效的数值计算及符号计算功能,能使⽤户从繁杂的数学运算分析中解脱出来;
⼴阔的线性代数,统计,傅⽴叶分析,筛选,优化,数值积分,解常微分⽅程的数学函数库。
具有完备的图形处理功能,实现计算结果和编程的可视化;
友好的⽤户界⾯及接近数学表达式的⾃然化语⾔,使学者易于学习和掌握;
功能丰富的应⽤⼯具箱(如信号处理⼯具箱、通信⼯具箱等) ,为⽤户提供了⼤量⽅便实⽤的处理⼯具。
MATLAB的编程接⼝给开发⼯具,提⾼代码质量和可维护性和性能的最⼤化。
它提供了基于MATLAB算法集成了,,NET和等与外部应⽤程序和语⾔功能。
1. 变量与矩阵
MATLAB在变量声明是不需要指出变量的类型。
clear; %清空内存
clc; %清空命令⾏
r1=1; %为⼀个变量赋值
z1=1+sqrt(3)*i; %赋值⼀个复数 sqrt()开⽅运算
z_real=real(z1); %复数的实部
z_img=imag(z1); %复数的虚部
z_abs=abs(z1); %复数的模
z_ang=angle(z1); %复数的幅⾓
z2=z1^2; %平⽅运算
MATLAB的数组索引从1开始,这点需要牢记。
arr1=rand(1,5); %arr1=[0.1418,0.4217,0.9157,0.7922,0.9594]
arr2=zeros(1,5); %arr2=[0,0,0,0,0]
arr3=ones(1,5); %arr3=[1,1,1,1,1]
arr4=linspace(1,2,5); %arr4=[1,1.25,1.5,1.75,2]
arr4=linspace(2,2,5); %arr4=[2,2,2,2,2]
mat1=rand(3,3); %随机⽣成3*3矩阵
mat2=[1,2,3;4,5,6;7,8,9];
获取⼀维数组的长度⽤length函数;获取多维函数的维数⼤⼩⽤size;
n = ndims(A) # 获取数组维度
numberOfElements = length(array) #即⼀维数组的长度或者多维数组中最⼤的维数⾏数或列数中的较⼤值
[m,n] = size(X) #获得矩阵的各个维数的⼤⼩
a=[1,2,3,4,5] #⽤逗号或空格间隔
a=[1 2 3 4 5]
x=初始值 :[步长]:终值
x=linspace(初始值 ,终值,个数n)
x=logspace(初始值 ,终值,个数n)#⽣成[10初值,10终值]之间等分的n个数如果步长省略,默认步长为50
M = max(A)
C = max(A,B)
for i=1:1:r
plot([time(w(i,1)),timev2(w(i,2))],[phaseznormal(w(i,1)),phasev2(w(i,2))],'--','Color',[0.5 0.5 0.5], 'LineWidth',0.5);
hold on
end
2. 分⽀与循环
MATLAB常⽤的分⽀语句有__if-else__和__switch-case__
limit = 0.75;
A = rand(10,1)
if any(A > limit)
disp('There is at least one value above the limit.')
else
disp('All values are below the limit.')
end
MATLAB常⽤的循环有__while__循环和__for__循环
for v = 1.0:-0.2:0.0
disp(v)
end
for v = [1 5 8 17]
Processing math: 100%
disp(v)
end
3. 函数及函数句柄
这⾥分别使⽤函数和函数句柄的⽅法来⽣成__Fibonacci__数列。
需要注意函数名和⽂件名要保持⼀致,以下先使⽤函数的⽅式:
function y = fibonacci (x)
if x == 1 || x==2
y = 1;
return % return可以不写
else
y = fibonacci(x-1) + fibonacci(x-2);
return
end
以下是使⽤函数句柄的⽅式:
fibo=@(n) (((1+sqrt(5))/2)^n-((1-sqrt(5))/2)^n)/sqrt(5);
fn=zeros(1,100);
for i=1:1:100
fn(i)=fibo(i);
end
4. 数值微积分
使⽤dx=0.000001为步长的向前差分求sin(x)的导数:
f,(x)=f(x+dx)−f(x)
dx
figure ('name','diff demo1');
x=linspace(0,10,100);
y=sin(x);
dx=0.000001;dydx=[];
for i=1:100
dydx(i)=(sin(x(i)+dx)-y(i))/dx;
end
plot(x,y,'r',x,dydx,'b');
legend('sin(x)','cos(x)');
title('diff demo');
xlabel('x');ylabel('y')
使⽤MATLAB的差分⼯具diff计算导数
h = 0.001; % step size
X = -pi:h:pi; % domain
f = sin(X); % range
Y = diff(f)/h; % first derivative
Z = diff(Y)/h; % second derivative
plot(X(:,1:length(Y)),Y,'r',X,f,'b', X(:,1:length(Z)),Z,'k')使⽤矩形法计算∫10x2dx:
∫b a f(x)dx=b−a
n
n
∑
i=1f(x i)
n=100000;a=0;b=1; %取步长为100000
x=a:1/n:b;
dx=(b-a)/n;x=x+dx/2;
s=x.^2; %采样
int=dx*sum(s);
调⽤MATLAB中的quad函数使⽤__Simpson__法计算数值积分:func=@(x)x.^2;
int=quad(func,0,1)
5. 常微分⽅程(组)的数值解
使⽤__Euler__法计算常微分⽅程(误差较⼤,不推荐):
dy
dx=x2+y2+3x−2y
y|x=0=1
取时间步长为h,则
y(x n+1)=y(x n)+f(y(x n),x n)∗h function matlab_demo
func=@(x,y)x.^2+y.^2+3*x-2*y
[x,y]=euler(func,[0,1],1,0.01)
plot(x,y)
return
function [x,y]=euler(fun,xspan,y0,h)
x=xspan(1):h:xspan(2)
y(1)=y0;
for n=1:length(x)-1
y(n+1)=y(n)+h*feval(fun,x(n),y(n))
end
return
使⽤45阶__Runge-Kutta__算法ode45计算常微分⽅程组:
dx
dt=2x−3y
dy
dt=x+2y
x|t=0=1
y|t=0=1 function ode_demo
y0=[1,1];
tspan=0:0.01:5;
option = odeset('AbsTol',1e-4);
[t,x]=ode45(@dfunc,tspan,y0,option);
figure('name','ode45 demo');
plot(t,x(:,1),'r',t,x(:,2),'b');
return
function dx=dfunc(t,x)
dx=zeros(2,1);
dx(1)=2*x(1)-3*x(2); % x(1)=x
dx(2)=x(1)+2*x(2); % x(2)=y
return
6. 偏微分⽅程(组)的数值解
使⽤pdepe进⾏微分⽅程(组)的求解,需要先将微分⽅程(组),以及边界和初值条件化为如下形式:
c(x,t,∂u
∂x)
∂u
∂t=x−m
∂
∂t[x m f(x,t,u,
∂u
∂x)]+s(x,t,u,
∂u
∂x) p(x,t,u)+q(x,t,u)∗f(x,t,u,
∂u
∂x)=0
u(x,t0)=u0
举⼀个例⼦:
∂u ∂t=∂2u
∂x2−u
u|x=0=1
u|x=1=0
u|t=0=(x−1)2求解过程如下:
function pde_demo
x=0:0.05:1;
t=0:0.05:1;
m=0;
sol=pdepe(m,@pdefun,@pdeic,@pdebc,x,t);
figure('name','pde demo');
surf(x,t,sol(:,:,1));
title('pde demo');
xlabel('x');ylabel('t');zlabel('u');
return
function [c,f,s]=pdefun(x,t,u,du) %⽅程描述函数
c=1;
f=1*du;
s=-1*u;
return
function [pa,qa,pb,qb]=pdebc(xa,ua,xb,ub,t) %边界描述函数
pa=ua-1;
qa=0;
pb=ub;
qb=0;
return
function u0=pdeic(x) %初值描述函数
u0=(x-1)^2;
return
7. ⽂件读取
#通过python ⽂件进⾏存储为txt格式,然后通过matlab代码直接读取
np.savetxt("xy1.txt", yvals,fmt='%d',delimiter=',')
clear ;close all; clc
data=load('./kinect/314637_Guesture_segment.txt')
x_dtw=data(:,1)
y_dtw=data(:,2)
z_dtw=data(:,3)
time=data(:,4)
%转置操作 data=data.’
phase=4*pi*(x_dtw.^2+y_dtw.^2+z_dtw.^2)/0.33
phaseznormal=zscore(phase)
save kinect.txt -ascii phaseznormal
8. 快捷键
4.1. 注释
Ctrl+r:选中要注释的多⾏⽂本,然后按Ctrl+r就可以实现多⾏注释。
Ctrl+t:选中已经注释了的多⾏⽂本,然后按Ctrl+t就可以取消多⾏注释。
Resource
: Matlab Tutorial using Jupyter Notebook
: a list of awesome demos, tutorials, utilities and overall resources for the robotics community that use MATLAB and Simulink. 后期学习机器⼈可以好好学习使⽤。