【編程語言】Matlab 學習記錄


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

MATLAB是一種語法簡單用途普遍的編程語言,既能夠用於編寫腳本,函數,也能夠用於面向對象的程序開發或開發GUI界面。MATLAB被普遍應用於數值計算,圖像處理,機器學習等領域。python

  1. 高效的數值計算及符號計算功能,能使用戶從繁雜的數學運算分析中解脫出來;
  2. 廣闊的線性代數,統計,傅立葉分析,篩選,優化,數值積分,解常微分方程的數學函數庫。
  3. 具備完備的圖形處理功能,實現計算結果和編程的可視化;
  4. 友好的用戶界面及接近數學表達式的天然化語言,使學者易於學習和掌握;
  5. 功能豐富的應用工具箱(如信號處理工具箱、通訊工具箱等) ,爲用戶提供了大量方便實用的處理工具。
  6. MATLAB的編程接口給開發工具,提升代碼質量和可維護性和性能的最大化。
  7. 它提供了基於MATLAB算法集成了CJava,NET和Microsoft Excel等與外部應用程序和語言功能。

1. 變量與矩陣

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

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]
   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

如下是使用函數句柄的方式: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

4. 數值微積分

使用dx=0.000001爲步長的向前差分求sin(x)的導數

\[f^,(x)=\frac{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')

使用矩形法計算\(\int_0^1x^2dx\)

\[\int_a^bf(x)dx=\frac{b-a}{n}\sum_{i=1}^nf(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__法計算常微分方程(偏差較大,不推薦):

\[\frac{dy}{dx}=x^2+y^2+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計算常微分方程組:

\[\frac{dx}{dt}=2x-3y \]

\[\frac{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,\frac{\partial{u}}{\partial{x}})\frac{\partial{u}}{\partial{t}}=x^{-m}\frac{\partial}{\partial{t}}[x^mf(x,t,u,\frac{\partial{u}}{\partial{x}})]+s(x,t,u,\frac{\partial{u}}{\partial{x}}) \]

\[p(x,t,u)+q(x,t,u)*f(x,t,u,\frac{\partial{u}}{\partial{x}})=0 \]

\[u(x,t_0)=u_0 \]

舉一個例子:

\[\frac{\partial{u}}{\partial{t}}=\frac{\partial^2{u}}{\partial{x^2}}-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

相關文章
相關標籤/搜索