title: Matlab Learning Record
date: 2020-05-23 20:11:26
author: liudongdong1
img: https://gitee.com/github-25970295/blogImage/raw/master/img/voice-recognition-speech-detect-deep-260nw-694633963.webp
reprintPolicy: cc_by
cover: false
categories: 語言框架
tags:java
MATLAB是一種語法簡單用途普遍的編程語言,既能夠用於編寫腳本,函數,也能夠用於面向對象的程序開發或開發GUI界面。MATLAB被普遍應用於數值計算,圖像處理,機器學習等領域。python
- 高效的數值計算及符號計算功能,能使用戶從繁雜的數學運算分析中解脫出來;
- 廣闊的線性代數,統計,傅立葉分析,篩選,優化,數值積分,解常微分方程的數學函數庫。
- 具備完備的圖形處理功能,實現計算結果和編程的可視化;
- 友好的用戶界面及接近數學表達式的天然化語言,使學者易於學習和掌握;
- 功能豐富的應用工具箱(如信號處理工具箱、通訊工具箱等) ,爲用戶提供了大量方便實用的處理工具。
- MATLAB的編程接口給開發工具,提升代碼質量和可維護性和性能的最大化。
- 它提供了基於MATLAB算法集成了C,Java,NET和Microsoft Excel等與外部應用程序和語言功能。
MATLAB在變量聲明是不須要指出變量的類型
。git
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開始,這點須要牢記
。github
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
;web
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
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] disp(v) end
這裏分別使用函數
和函數句柄
的方法來生成__Fibonacci__數列。數組
須要注意函數名和文件名要保持一致
,如下先使用函數
的方式:框架
function y = fibonacci (x) if x == 1 || x==2 y = 1; return % return能夠不寫 else y = fibonacci(x-1) + fibonacci(x-2); return end
如下是使用函數句柄
的方式:dom
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
使用dx=0.000001爲步長的向前差分求sin(x)的導數
:
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')
使用矩形法計算\(\int_0^1x^2dx\):
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)
使用__Euler__法計算常微分方程(偏差較大,不推薦):
取時間步長爲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
計算常微分方程組:
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
使用pdepe
進行微分方程(組)的求解,須要先將微分方程(組),以及邊界和初值條件化爲以下形式:
舉一個例子:
求解過程以下:
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
#經過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
Ctrl+r
:選中要註釋的多行文本,而後按Ctrl+r
就能夠實現多行註釋。
Ctrl+t
:選中已經註釋了的多行文本,而後按Ctrl+t
就能夠取消多行註釋。