MATLAB語法

  • figure('color','white');%把figure的背景顏色改爲白色
  • set(gcf,'position',[100 100 500 500]);%起始座標爲100,100這是顯示器的像素值,寬度爲500個像素,高度爲500
  • X=linspace(5,100,20) % 產生從5到100範圍內的20個數據,相鄰數據跨度相同。這和X=[5 : 5 : 100]的效果是一樣的
  • text(x,y,'string'):在二維圖形中指定的位置(x,y)上顯示字符串string
  • MSE:預測(擬合)數據和原始數據對應點誤差的平方和的均值
  • figure是建立圖形的意思,系統自動從1,2,3,4...來建立圖形,數字代表第幾幅圖形,figure(1),figure(2)就是第一第二副圖的意思,在建立圖形的時候,它的標題就是figure1或figure2等等,對應到程序中就是例子語句
    一般建立新圖只需要一個figure就行,系統自動建立新圖,可以簡單一點,當然要加上也可以
    相關的畫圖的:多子圖,就是一張圖中有好多小圖,也是有標號的
    使用以下命令
    subplot(m,n,k)
    subplot('Position',[left bottom width height])
    m表示畫幾行
    n表示畫幾列
    k表示現在畫的是第幾幅圖
  • MATLAB之plot的用法https://blog.csdn.net/chduan_10/article/details/74568129
  • Matlab的mapminmax函數說明:https://blog.csdn.net/jeep_ouc/article/details/50241141

  • BP神經網絡中神經元閾值的意思:http://www.ilovematlab.cn/thread-203711-1-1.html
    (出處: MATLAB中文論壇)

  • >> A = magic(5)
    R1 = A(1:2:end,2:2:end)%從第一行開始每隔一行取一行;從第二列還是每隔一列取一列
    R2 = A(2:2:end,1:2:end)%從第二行開始每隔一行取一行;從第一列還是每隔一列取一列

    A =

        17    24     1     8    15
        23     5     7    14    16
         4     6    13    20    22
        10    12    19    21     3
        11    18    25     2     9


    R1 =

        24     8
         6    20
        18     2


    R2 =

        23     7    16
        10    19     3

  • eye(3);%生成3階單位矩陣E

  • A.*B;%代表A與B的對應元素相乘。              A.^2;%同理代表A與A的對應元素相乘。

  • sum(sum(A));%矩陣A所有元素求和。          sum(A);%矩陣每列求和的行向量    sum(A,2);%矩陣每行求和的列向量

  •   R = subs(f, old, new) ;%利用new的值代替old的值,並帶入f中。

  • >> simplify(x^2+5*x+6*x-2)%2016版以後用simplify代替simple
     
    ans =
     
    x^2 + 11*x - 2

  • varargin函數用來傳遞變量列表。

  • a = varargin{1}%獲取傳入的第一個參數,並賦值給a
    你的函數可能是這樣的
    function varargout = test(varargin) {
    a = varargin{1};
    };
    調用的時候使用test(參數1, 參數2, 參數3);
    可以傳入多個參數。

  • isprime(i)%判斷i是否是質數

  • a=[1 2 3]; b= [2 3 4];meshgrid(a,b)生成2維網格矩陣

    >> [x y]=meshgrid(a,b)

    x =
        1     2     3
        1     2     3
        1     2     3
    y =
        2     2     2
        3     3     3
        4     4     4  

  • >> linspace(1,5,5)%linspace(a1,a2,N) 是生成間距爲(a2-a1)/(N-1)、個數爲N的數組的命令。

    ans =

         1     2     3     4     5

  • erf()函數:

  • A爲某一矩陣,poly(A)就能夠得到該矩陣的特徵多項式的各項係數

  • a=[1 2 3]; %多項式爲x^2+2*x+3

    A=[1 2;3 4]; %定義一個二維矩陣

    polyvalm(a,A) %求結果

    ans =

    12 14

    21 33

    其實相當於把A這個二維矩陣直接替換變量x,即求 A^2+2*A+3*E 這個矩陣多項式。

  • >> p = [3 2 1];

  • >> polyval(p,1)%直接將x=1帶入3x^2+2x+1求結果

    ans =

         6

  • 矩陣的奇異值分解:[s,v,d]=svd(A)    LU分解:[l,u]=lu(A)    正交分解:Q=orth(A)

  • [e,f]=eig(A);%e爲矩陣A的特徵向量,f爲矩陣A的特徵值。

  • >> log(exp(1))%matlab中的ln(x)用log(x)表示

    ans =

         1

  • A'%共軛轉置。A.'%一般轉置。

  • syms x y;%注意:x與y之間不能用","。

  • A=[1 2 3;%提取A的3,2,1行,反覆三次由首列構成子矩陣
       4 5 6;
       7 8 0];
    B1=A([3 2 1],[1 1 1])

    >>B1 =

         7     7     7
         4     4     4
         1     1     1

  • B1=A(:,end:-1:1);%矩陣左右翻轉,等同於B=fliplr(A)            B1=A(end:-1:1,:);矩陣上下翻轉,等同於B=flipud(A) 

  • rot90(A);%將矩陣A逆時針旋轉90度、

  • & | ~ xor %與或非異或

  • A=[1 2 3;
       4 5 6;
       7 8 0];
    find(A>=5)%找到矩陣中大於5的元素的位置(按列數)

    ans =

         3
         5
         6
         8

  • [i,j]=find(A>=5)%找到矩陣中大於5的元素的位置並賦值給i,j

  • all(A>=5)%當A的某列元素全部大於或等於5時,相應元素爲1,否則爲0

    ans =

         0     0     0

  • any(A>=5)%當A的某列元素含有大於或等於5時,相應元素爲1,否則爲0

    ans =

         1     1     1

  • all(A(:)>=5)%判斷元素是否均大於等於5

  • 化簡函數:collect()合併同類項,expand()展開多項式,factor()因式分解,numden()提取多項式的分子和分母

  • 多項式的除法:被除數:2*x.^4-12*x.^3+19*x.^2-29*x+37,除數:x.^2-6*x+7
    [q,r]=deconv([2 -12 19 -29 37],[1 -6 7])

    q =%商

         2     0     5


    r =%餘數

         0     0     0     1     2

  • unwrap函數會將絕對值超過pi的角度增加或減少(2*k*pi)角度後換算回(-pi,pi)區間中。
  • /與\%a/b表示矩陣a乘以矩陣b的逆;a\b表示矩陣a的逆乘以b。
  • format %例子:

    clc

    format compact%格式緊湊

    A1=100

    A2=pi

    A3=rand(3,4)

    format('loose') %等價於format loose%格式疏鬆

    A4=100

    A5=pi

    A6=rand(3,4)

    可以看出A1 A2 A3之間沒有空行,是以compact形式顯示,而A3 A4 A5 A6間都有一行空行,以loose形式顯示。

  • save mydata A%生成mat數據文件

  • load mydata A%讀取mat數據文件

  • r=size(A,1)%該語句返回的是矩陣A的行數,

    c=size(A,2)%該語句返回的是矩陣A的列數。

  • rem(10,3)=1%取餘

  • 函數句柄@%例子

       poly6 = @(x) 8*x.^6+6*x.^5+3*x.^3+x.^2+x+520;
       fplot(poly6,[0,100]);

 

  • axis([0,200,0,1])%畫圖的時候限制x∈[0,200],y∈[0,1]
  • rand('state',0)%比如你運行u2 = rand(3,1)三次,分別產生u2 =  0.9501   0.2311   0.6068,u2 =   0.4860   0.8913   0.7621,u2 =   0.4565   0.0185   0.8214三組隨機數,運行rand('state',0)後,再運行u2 = rand(3,1)三次,產生的隨機數就得前三次的一樣,運行u2 = rand(3,1)第四次後的結果就不一樣了。
  • [a,b,c,d,e,f,g,h] = deal(0);%連續複製a=b=c=d=e=f=g=h=0
  • >> A = [70 30 30];
    >> numel(A) 
    %返回A中數組元素個數,3
    ans =
         3
  • K>> A = [1 2 3 4];
    K>> numel(A)
    ans =
         4
    K>> numel(A,2)
    ans =
         1
  • 1*8+1:2*8 = (1*8+1):(2*8);%也就是說 + - * / 優先級順序比 : 的高
  • A = repmat(10,3,2)%創造一個3*2的元素是10的矩陣
    A = 3×2

        10    10
        10    10
        10    10

  •  b = exist( 'a', 'kind');
     kind 表示 a 的類型,可以取的值爲:builtin(內建類型),class(類),dir(文件夾),file(文件或文件夾),  var(變量)。若 a 存在,則 b = 1; 否則 b = 0;

  • addpath(genpath(pwd));%主文件夾和子文件夾不在一個文件夾下調用

  • fix(x);%向0取整

       >> fix(2.5)
       ans =
       2
       >> fix(-1.8)
       ans =
       -1

  • break就是用來跳出本層for和while的,跟有沒有if沒有關係。
  • x = 1001;
    s = fix(sqrt(x));% 31
    p = 1;
    for i = 1:s
       if mod(x,i)==0%1001與i取餘
            p = 0;
            break
       end
    end
    if p == 1
        disp('該數是素數')
    else
        disp('該數不是素數')
    end
    >> 該數不是素數
  • 希臘字母等特殊字符用 \加拼音 如

    α \alpha β \beta γ \gamma θ \theta Θ \Theta Г \Gamma δ \delta Δ \Delta ξ \xi Ξ \Xi η \elta ε \epsilong ζ \zeta μ \miu υ \nu τ \tau λ \lamda ∧ \Lamda π \pi ∏ \Pi σ \sigma ∑ \Sigma φ \phi Φ \Phi ψ \psi Ψ \Psi χ \chi ω \ommiga Ω \Ommiga
  • >> A = [1 2 3];%std求標準差,默認是除以(n-1)
    >> std(A,1)
    ans =
        0.8165
    >> std(A,0)
    ans =
         1
    >> sqrt(2/3)
    ans =
        0.8165
    >> std(A)
    ans =
         1
  • r = randi(imax,m,n);%返回一個在[1,imax]範圍內的m*n的僞隨機整數矩陣

  • K>> smi=randi([1 4])%返回一個介於1到4的僞隨機整數標量
    smi =
         1
    K>> smi=randi([1 4])
    smi =
         4
    K>> smi=randi([1 4])
    smi =
         2

  • unifrnd(20,30,1000,1);%產生一個1000*1 的array,這個array中的每個元素爲20到30之間連續均勻分佈的隨機數

  • unifrnd(a,b);%返回由a和b分別指定的上、下端點的連續均勻分佈生成的隨機數.(可以是小數.)

  • >> A=[1+i 1-i;2+i 2-i];
    >> A'%普通轉置
    ans =
       1.0000 - 1.0000i   2.0000 - 1.0000i
       1.0000 + 1.0000i   2.0000 + 1.0000i
    >> A.'%共軛轉置
    ans =
       1.0000 + 1.0000i   2.0000 + 1.0000i
       1.0000 - 1.0000i   2.0000 - 1.0000i

  • y = randperm(n);%y是把1到n這些數隨機打亂得到的一個數字序列

       K>> randperm(5)
       ans =
                 3     4     2     5     1

  • p = randperm(n,k);%返回行向量,其中包含在 1 到 n(包括二者)之間隨機選擇的 k 個唯一整數。

  • mean(x);%返回每列的平均值

  • mean(x,2);%返回每行的平均值

  • K>> A=[1 2 3;4 5 6;7 8 9];
    K>> B=[1 2 3];
    K>> bsxfun(@minus,A,B)%實現逐元素運算,函數bsxfun可以避免用循環結構編程。
    ans =                                %兩個輸入數組的非單一維度必須相互匹配。 
         0     0     0
         3     3     3
         6     6     6

  • K>> A = [1 2 3;4 5 6];
    K>> B = [1 2 3];
    K>> bsxfun(@times,A,B)%bsxfun(@times,B,A)一樣的結果
    ans =
         1     4     9
         4    10    18

  • K>> A = [1 2 3 4 5 6];
    K>> A(2+1:4) % 取A的從第2個元素到第四個元素
    ans =
         3     4

  • [Y,U]=max(A);%返回行向量Y和U,Y向量記錄A的每列的最大值,U向量記錄每列最大值的行號。(如果有多個最大值,只記錄第一個)

  • C = max(A,B);%返回從 A 或 B 中提取的最大元素的數組。

    A = [1 7 3; 6 2 9]
    A = 2×3
    
         1     7     3
         6     2     9
    
    
    B = 5;
    C = max(A,B)
    C = 2×3
    
         5     7     5
         6     5     9
    
  • >> a = [-1.9, -0.2, 3.4, 5.6, 7.0];
    >> round(a) % 四射五入
    ans =
        -2     0     3     6     7

  • nchoosek(N,M)%N!/(N-M)!/M!

  • K>> a=[1,2,4;0,0,0;1,3,5;0,0,0]
    a =
         1     2     4
         0     0     0
         1     3     5
         0     0     0
    K>> all(a==0, 2)%返回的是一個列向量,可以檢測到全零行的位置,因爲使用了a=0,返回的爲0代表是非零元素,返回的                              %爲1代表是全零行
    ans =
      4×1 logical 數組
       0
       1
       0
       1
    K>> a(all(a==0,2),:)=[]%刪除全0行
    a =
         1     2     4
         1     3     5

  • 在調試 MATLAB® 代碼文件時,可以發出 dbstack 命令來查看堆棧跟蹤信息。

    創建文件 myfile.m,其中包含以下語句。

    function n = myfile(x)
    n = myfunction(x-1);
    end
    
    function z = myfunction(y)
    z = 2 / y;
    end

    在 myfunction 中設置斷點,並通過輸入 1 運行 myfile。執行 myfunction 時,MATLAB 在第 z = 2/y 行暫停。

    dbstop in myfile>myfunction
    myfile(1);

    運行 dbstack 命令。MATLAB 會顯示行號和導致當前斷點的函數調用的文件名。

    dbstack
    In myfile>myfunction (line 5)%左邊會有一個小白箭頭
    In myfile (line 2)%左邊會有一個小白箭頭
  • 屬性的訪問權限可以被細分爲賦值SetAccess和查詢GetAccess的權限。如:

    properties(SetAccess=private, GetAccess=public)
        var
    end

    表明該屬性可以被外界程序查詢值,但不能被外部程序賦值,賦值只能在類的內部進行。

  • title('my title','fontsize',12);%設置字體大小爲12號字體

    xlabel('my xlabel','fontsize',12);
    ylabel('my ylabel','fontsize',12);

  • f=@(x)acos(x) 相當於建立了一個函數文件。f 爲函數句柄,@是定義句柄的運算符:
    % f.m
    function y=f(x)
    y=acos(x);

    函數句柄的使用方法也和函數是一樣的。

  • K>> A = [1 2 3 3 2 0];
    K>> unique(A) %去除A中重複的值,並從小到大排序
    ans =
         0     1     2     3

  • K>> GI  = [1 2 3 2];
    K>> OC = [1 2 3];
    K>> find(GI == OC(1))
    ans =
         1
    K>> find(GI == OC(2))%find最終返回的是GI的位置
    ans =
         2     4

  • A = 1:5;
    B = cumsum(A)%求A的累積和
    B = 1×5
    
         1     3     6    10    15
    
  • matlab 審查代碼的時候會提示許多錯誤、不規範的代碼或有潛在風險的代碼。
    %#ok 可以標記這個地方是有意使用(或無法避免)不規範的代碼或有潛在風險的代碼。標記後 matlab 就不會再提示這個錯誤了。這個比較厲害
  •     for j = []
            Q = 2;
    %這一步不會執行
        end
  • K>> [cj, so]=sort([1 5 6 9 2 3])%默認從小到大進行排序
    cj =
         1     2     3     5     6     9
    %返回原數組從小到大排序後的數組
    so =
         1     5     6     2     3     4
    %返回排序後的數字在原數組的位置
  • K>> [cj, so]=sort([1 5 6 9 2 3],'descend')%從大到小進行排序
    cj =
         9     6     5     3     2     1
    so =
         4     3     2     6     5     1
  • cell2mat();%這個語句非常重要,用來將最後的數據轉換成矩陣,用來保存數據
  • F = false(sz1,...,szN);%是由邏輯值“0”組成的 sz1×...×szN 數組

  • A =
        95    45    92    41    13     1    84
        95     7    73    89    20    74    52
        95     7    73     5    19    44    20
        95     7    40    35    60    93    67
        76    61    93    81    27    46    83
        76    79    91     0    19    41     1

    B = sortrows(A);%默認依據第一列的數值按升序移動每一行,如果第一列的數值有相同的,依次往右比較。例:
    B =
        76    61    93    81    27    46    83
        76    79    91     0    19    41     1
        95     7    40    35    60    93    67
        95     7    73     5    19    44    20
        95     7    73    89    20    74    52
        95    45    92    41    13     1    84

  • >> h1 = legend('x');
    >> set(h1,'box','off')
    %去除legend邊框

  • 用legend畫圖例,一定要把所有的圖畫完了再在最下面加legend('y1','y2','y3');

  • A = [3 6 2 1 5 1 1]; 
    B = [2 4 6];
    C = setdiff(A,B)%查找A中存在,B中不存在的值。
    C = 1×3
    
         1     3     5
  • M = max(A,[],dim) %返回維度 dim 上的最大元素。例如,如果 A 爲矩陣,則 max(A,[],2) 是包含每一的最大值的列向量。dim = 1 是列。(這有點特別)
  • K>> A = [0 0 3;0 0 3;0 0 3]
    A =
         0     0     3
         0     0     3
         0     0     3
    K>> B = any(A,2)%通過指定 dim = 2 測試 A 的中是否有非零元素。
    B =
      3×1 logical 數組
       1
       1
       1
  • K>> A = randi(3,10,3)%函數產生均勻分佈的僞隨機整數
    A =
         2     1     3
         2     3     1
         3     2     3
         1     1     1
         3     1     3
         3     3     1
         1     3     3
         3     1     1
         3     2     2
         3     1     2
    K>> [C,ia,ic] = unique(A(:,1:2),'rows')%基於前兩列的數據查找 A 中的唯一行。指定三個輸出以返回索引向量 ia 和 ic,C = A(ia) and A = C(ic);注:ia是指C中元素在矩陣A中的位置;ic是指A中元素在矩陣C中的位置。
    C =
         1     1
         1     3
         2     1
         2     3
         3     1
         3     2
         3     3
    ia =%A中唯一行的行號
         4
         7
         1
         2
         5
         3
         6
    ic =%ic是指A中元素在矩陣C中的位置
         3   :2     1
         4   :2     3
         6   :3     2
         1   :1     1
         5   :3     1
         7   :3     3
         2   :1     3
         5   :3     1
         6   :3     2
         5   :3     1
  • K>> B = [1,1];
    K>> abs(B)%求絕對值
    ans =
         1     1
    K>> norm(B)%求二範數
    ans =
        1.4142
  • [Y1, Y2, Y3, ...] = deal(X1, X2, X3, ...) %與 Y1 = X1Y2 = X2Y3 = X3 ... 相同

  • 保存隨機數生成器的當前狀態並創建一個由隨機數組成的 1×5 向量。

    s = rng;
    r = rand(1,5)
    r = 1×5
    
        0.8147    0.9058    0.1270    0.9134    0.6324
    
    

    將隨機數生成器的狀態恢復爲 s,然後創建一個由隨機數組成的新 1×5 向量。值與之前相同。

    rng(s);
    r1 = rand(1,5)
    r1 = 1×5
    
        0.8147    0.9058    0.1270    0.9134    0.632
  • >> rands(2,2)%rands 函數一般是用在神經網絡的權值和閾值的初始化時,範圍是-1到1K
    ans =
       -0.6048    0.8495
       -0.4401    0.3391

  • ceil 是向正無窮方向取整
    如a = [-1.9, -0.2, 3.4, 5.6, 7, 2.4+3.6i]
    ceil(a)後:a=[-1,0,4, 6, 7 ,3+4i]

  • ⌊ x ⌋ 上面缺一橫: 不大於x的最大整數。

  • x 下面缺一橫: 不小於x的最小整數

  • K>> A = [3 4];%相乘
    K>> prod(A)
    ans =
        12
    K>> A = [1 2;3 4];%列相乘
    K>> prod(A)
    ans =
         3     8

  • continue的作用是跳過continue之後的代碼,繼續進行循環操作,但是如果continue之後沒有代碼,continue在這裏不起任何作用

  • 元胞數組cell內所屬的元素可以存儲不同類型數據,相當於c語言的結構體

  • tfdata(h,'v')中的v是什麼意思?加上'v',可以讓輸出的值由元胞數組改爲數組直接輸出:
    舉個例子:
    h = tf([1 1],[1 2 5]);
    [num,den] = tfdata(h)
    可以看出輸出的num和den爲元胞數組的形式無法直接輸出,如果想輸出他們的值,就必須用以下命令:
    num=num{1};
    den=den{1};
    而添加上'v'之後,就可以省略上面的兩步,直接得到num和den的向量。
    h = tf([1 1],[1 2 5]);
    [num,den] = tfdata(h,'v')

  • pinv(A);求其僞逆矩陣

  • >> A = [11 12;21 22]
    A =
        11    12
        21    22
    >> B = [31 32;41 42]
    B =
        31    32
        41    42
    >> horzcat(A,B)%水平連接矩陣
    ans =
        11    12    31    32
        21    22    41    42
    >> vertcat(A,B)%垂直連接矩陣
    ans =
        11    12
        21    22
        31    32
        41    42

  • quadprog求解標準二次規劃問題:

    x = quadprog(H,f,A,b,Aeq,beq,lb,ub);%目標函數的H和f,不等式約束Ax≤b,等式約束Aeq*x=beq,自變量最小值最大值lb≤x≤ub.
  • 顏色符號:r red   g green   b blue   y yellow   k black   w white
  • eval:eval的功能簡單來說就是可以把字符串當做命令來執行。例:eval('y=sin(1)')與命令 y=sin(1)等價
  • dsolve:解常微分方程
  • s=tf('s');%s爲設定的變量
  • system=8611.77/(((s+0.55)^2+36)*((s+0.25)^2+15.4^2));%自己設置的系統參數
  • Ts=0.2;%採樣時間
  • plant=c2d(system,Ts);%將系統離散化
  • Q=diag(ones(10,1),0);%對角線是1的10*10的矩陣,此處是單位陣。相當於eye(10)
  • D = diag(v,k) 將向量 v 的元素放置在第 k 條對角線上。k=0 表示主對角線,k>0 位於主對角線上方,k<0 位於主對角線下方。例:S=diag(ones(40-1,1),1);%將39個1放置在主對角線上方的第一條對角線,注意這裏的-1一定要有。
  • blkdiag函數中:作用是生成以矩陣塊爲對角線的矩陣;
    a=[1 2;
         3 4];
    blkdiag(a,a)=[1 2 0 0
                              3 4 0 0
                              0 0 1 2
                              0 0 3 4];
  • 可控性判斷:>> A= [-2.692 161.863 -42.524;
          0 -33.333 0;
          0 0 -10];
    >> B = [0 0;
          33.333 0;
          0 10];
    >> Co=ctrb(A,B);
    >> rank(Co)
    ans =
         3   %所以可控
  • 可觀性判斷:>> A= [-2.692 161.863 -42.524;
          0 -33.333 0;
          0 0 -10];
    >> C = [-0.00193 0.124 0;
          1 0 0];
    >> rank(obsv(A,C))
    ans =
         3   %所以可觀
  • sign(x):符號函數(Signumfunction)。1,前提是 x 的對應元素大於 00,前提是 x 的對應元素等於 0-1,前提是 x 的對應元素小於 0x./abs(x),前提是 x 爲複數。
  •  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章