一小時 Matlab 速成筆記


一小時 Matlab 速成筆記

本文參考 bilibili視頻教程 等相關資料,記錄本人臨時抱佛腳學習 Matlab 的過程。

本文首發在本人博客——巧遇小屋 中。

1.變量定義與基本運算

1.1 生成矩陣

%%
% 建議有C語言或其他編程基礎,了解線性代數和矩陣相關知識
% https://ww2.mathworks.cn/help/matlab/
% 加*為了解內容
% 生成矩陣
    % 直接法
        a = [1,2,3;4,5,6;7,8,9];
    % 冒號一維矩陣 a = 開始:步長:結束,步長為1可省略
        b = 1:1:10;  % 1,2,...10
        b = 1:10;  %與上一個等價
    % 函數生成
        % linspace(開始,結束,元素個數),等差生成指定元素數的一維矩陣,省略個數則生成100個
            c = linspace(0,10,5);
        % 特殊矩陣
            e = eye(4);  % eye(維數)單位陣 對角全為 1
            z = zeros(1,4);  % zeros(維數)全零陣 1行4列
            o = ones(4,1);  % ones(維數)全1陣 4行1列
            r = rand(4);  % rand(維數)0~1分布隨機陣
            rn = randn(4);  % randn(維數)0均值Gaussian分布隨機陣

learn_matlab-1635819330873-2021112101531.png

1.2 矩陣運算

%%
% 矩陣運算
    diag_a = diag(a,1);  % diag(行向量,主對角線上方第k條斜線)用行向量生成對角陣
    tril_a = tril(a,1);  % tril(矩陣,主對角線上方第k條斜線)生成矩陣的下三角陣,triu上三角陣
    % 加、減、乘、乘方
        a*a     %矩陣乘法;第i行乘第j列
    % 點運算
        % a.*b , a./b , a.\b , a.^b  對應元素的*,/,\,^運算
        a.*a
    % 逆矩陣
        pinv(a)  % 偽逆矩陣,當a不是方陣,求廣義逆矩陣;當a是可逆方陣,結果與逆矩陣相同
    % 特征值,特征向量
        [v,D] = eig(a);  % 輸出v為特征向量,D為特征值對角陣
    % *行列式
        det(a)
    % *秩
        rank(a)
    % *伴隨
        compan(b)
        

learn_matlab-1635819625973-2021112102026.png

learn_matlab-1635820081232-202111210281.png

1.3 矩陣的修改

%%
% 矩陣的修改
    %部分替換
        chg_a = a;
        chg_a(2,3) = 4;  % (行,列)元素替換
        chg_a(1,:) = [2,2,2];  % (行,:)替換行,為[]刪除該行, : 代表取全部
        chg_a(:,1) = [];  % (:,列)替換列,為[]刪除該列
    % 轉置
        T_a = a';
    % 指定維數拼接
        c1_a = cat(1,a,a);  % 垂直拼接
        c2_a = cat(2,a,a);  % 水平拼接
    % *變維
        rs_a = reshape(a,1,9);  % 元素個數不變,矩陣變為m*n

1.4 信息獲取

%%
% 信息獲取
    % 矩陣的行列數
        [row_a, col_a] = size(a);  % [行數,列數]
    % 行列中最大的(不是a中最大的)
        len_a = length(a);

1.5 多維數組

% 多維數組
    % 創建
        % 直接法
            mul_1(:,:,1) = [1,2,3;2,3,4];
            mul_1(:,:,2) = [3,4,5;4,5,6];
        % *擴展法
            mul_2 = [1,2,3;2,3,4];
            mul_2(:,:,2) = [3,4,5;4,5,6];  % 若不賦值第一頁,第一頁全為0
        % cat法
            mul_31 = [1,2,3;2,3,4];
            mul_32 = [3,4,5;4,5,6];
            mul_3 = cat(3,mul_31,mul_32);  % 把a1a2按照“3”維連接

1.6 字符串

% *字符串
    % 創建
        str0 = 'hello world';  % 單引號引起
        str1 = 'I''m a student';  % 字符串中單引號寫兩遍
        str3 = ['I''m' 'a' 'student'];  % 方括號鏈接多字符串
        str4 = strcat(str0, str1);  % strcat連接字符串函數
        str5 = strvcat(str0, str1);  % strvcat連接產生多行字符串
        str6 = double(str0);  % 取str0的ASCII值,也可用abs函數
        str7 = char(str6);  % 把ASCII轉為字符串
    % 操作
        % 比較
            strcmp(str0, str1);  % 相等為1,不等為0
            strncmp(str0, str1, 3);  % 比較前3個是否相等(n)
            strcmpi(str0, str1);  % 忽略大小寫比較(i)
            strncmpi(str0, str1, 3);  % 忽略大小寫比較前3個是否相等
        % 查找替換
            strfind(str0, str1);  % 在str0找到str1的位置
            strmatch(str1, str0);  % 在str0字符串數組中找到str1開頭的行數
            strtok(str0);  % 截取str0第一個分隔符(空格,tab,回車)前的部分
            strrep(str0, str1, str2);  % 在str0中用str2替換str1
        % 其他
            upper(str0);  % 轉大寫,lower轉小寫
            strjust(str0, 'right');  % 將str0右對齊,left左對齊,center中間對齊
            strtrim(str0);  % 刪除str0開頭結尾空格
            eval(str0);  % 將str0作為代碼執行

1.7 轉換

%轉換
    % ___2___  -->  如num2str,將數字轉字符串; dec2hex,將十進制轉十六進制
    str_b = num2str(b);
    % abs,double取ASCII碼;char把ASCII轉字符串
    abs_str = abs('aAaA');

learn_matlab-1635837128772-202111215129.png

2. 程序結構

a = 5;
x = [1, 2]; y =[3, 4];

2.1 選擇結構

%選擇結構
    %if-elseif-else-end
        if a>0
            disp(x);
        elseif a==0
            disp(a);
        else
            disp(a-1);
        end
        
    %switch-case-otherwise-end
        switch a
            case 0
                disp(a);
            case 1
                disp(a+1);
            otherwise
                disp('aaa');
        end
        
    %try-catch
        try
            z = x*y;
        catch
            z = x.*y;  % 若try出錯,則執行
        end
        disp(z);

2.1 循環結構

% 循環結構
    % for 循環變量=初值:步長:終值 - end
    for i=0:1:10  % 步長為負,則初值大於終值
        disp(i);  % 循環體內不可對循環變量做修改
    end
    
    % while-end
    while a>2
        disp(a);
        a = a-1;
    end

2.2 程序控制

%程序控制
    %continue 跳過當次循環剩下語句,進入下一循環
    %break 跳出當前循環
    %return 跳出程序並返回

2.3 .m文件

%m文件
    % 1. 腳本文件:沒有輸入輸出參數,執行后變量結果返回工作空間,可直接運行
        %以下是腳本文件,文件名假設為exxp.m
        %**********************************************
            clear   % 清理工作區的變量
            r = 5;
            s = pi*r*r;
            p = 2*pi*r;
            disp(s)
            disp(p)
        %**********************************************
        %以下是調用
        %**********************************************
            exp
        %**********************************************
    % 2. 函數文件:以function開頭,有輸入輸出,變量為局部變量不返回工作空間,需要調用
        %以下是函數文件
        %**********************************************
            function [s, p] = circ(r)  % 文件命名應與函數名一致,系統找文件名circ.m
            %CIRC 計算圓面積和周長  % 簡單說明
            %參數:輸入參數r:圓半徑;輸出參數s:圓面積,p:周長  % 詳細說明
                s = pi*r*r;
                p = 2*pi*r;
            end
        %**********************************************
        %以下是調用
        %**********************************************
            [a, b] = circ(5);  % 返回為多個參數時,若寫a = circ(5)則保留第一個返回值
        %**********************************************
        % * 以下是帶子函數的函數文件
        %**********************************************
        function y = key(w)  % 主函數放第一個,函數名為key
            if w==0
                y = type0(w);  % 調用子函數type0
            else
                y = type1(w);
            end
        end
        function y0 = type0(a)  % 子函數,各子函數之間順序無所謂
            y0 = a+1;
        end
        function y1 = type1(a)
            y1 = a+4;
        end
        %**********************************************
        %*函數輸入輸出參數可以不定
        %nargin:輸入參數個數,nargout:輸出參數個數
        %varargin:輸入參數內容的元胞數組,varargout:輸出參數
        %以下是函數文件
        %**********************************************
        function varargout = idk(varargin)
            x = length(varargin);
            varargout{1} = x;
            varargout{2} = x+1;
        end
        %**********************************************   

learn_matlab-1635838692544-2021112153812.png

3. 圖像繪制

x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);

3.1 二維圖形繪制

% 二維曲線繪制
    % 基本函數
        % plot(y)
            % y為向量
                plot(y1);  % 縱坐標為y的值;橫坐標自動為元素序號(角標+1),此處為1~9
            % y為矩陣
                figure;  % 開啟新繪圖窗口,下一次繪圖在新窗口
                y = [y1', y2'];
                plot(y);  % 當y為矩陣,按每一列畫出曲線,顏色自動區分
        % plot(x, y)
            % xy為向量
                plot(x, y1);  % 先繪制曲線
        % plot(x1, y1, x2, y2...)
            plot(x, y1, x, y2);  % 在同一個窗口同一坐標軸繪制多條曲線
    % 線性圖形格式設置
        % 線形顏色數據點
            plot(x, y1, 'b:o');  % 藍色 點線 圓圈
            % b藍 g綠 r紅 c青 m紫 y黃 k黑 w白
            % -實線 :點線 --虛線 -.點畫線
            % .實點 o圓圈 x叉 +十字 *星號 s方塊 d鑽石 v下三角 ^上三角 <左三角 >右三角 p五角星 h六角星
        % 坐標軸
            plot(x, y1);
            axis([-1*pi, 3*pi, -1.5, 1.5]);  % 規定 橫、縱 坐標范圍
    % 圖形修飾
        % 標題標簽
            title('a title');  % 圖像標題
            xlabel('this is x');  % x軸標記,同理還有ylabel,zlabel
        % 圖例設置
            legend('hahaha', 'location', 'best');  % str的順序與繪圖順序一致; 'best'指圖例位置最佳化,還有其他位置
        % 圖形保持
            plot(x, y1);
            hold on;  % 在原有窗口y1曲線上增加繪制下一個圖形
            plot(x, y2);  % y2在同一窗口內被繪制
            hold off;
        % 分割繪制
            subplot(2, 2, 1);  % 分割成2x2區域,在第一塊區域繪制下一個圖形
            plot(x, y1);  % y1被繪制在4塊區域的第一塊
            subplot(2, 2, 2);  % 分割方法相同,區域改變
            plot(x, y2);  % y2在第二塊區域

3.2 二維特殊圖形

%*二維特殊圖形繪制
    %柱狀圖
        bar(x, y, width, '參數');  % x橫坐標向量,m個元素; y為向量時,每個x畫一豎條共m條,矩陣mxn時,每個x畫n條;
                                   % width寬度默認0.8,超過1各條會重疊;
                                   % 參數有grouped分組式,stacked堆棧式; 默認grouped
                                   % bar垂直柱狀圖,barh水平柱狀圖,bar3三維柱狀圖,barh3水平三維柱狀圖(三維多一個參數detached, 且為默認)
    %餅形圖
        pie(x, explode, 'lable');  % x為向量顯示每個元素占總和百分比, 為矩陣顯示每個元素占所有總和百分比
                                   % explode向量與x同長度,為1表示該元素被分離突出顯示,默認全0不分離
                                   % pie3繪制三維餅圖
    %直方圖
        hist(y, n);  % y為向量,把橫坐標分為n段繪制
        hist(y, x);  % x為向量,用於指定每段中間值, 若取N = hist(y, x), N為每段元素個數
    %離散數據圖
        stairs(x, y, 'b-o');  % 階梯圖,參數同plot
        stem(x, y, 'fill');  % 火柴桿圖,參數fill是填充火柴桿,或定義線形
        candle(HI, LO, CL, OP);  % 蠟燭圖:HI為最高價格向量,LO為最低價格向量,CL為收盤價格向量,OP為開盤價格向量
    %向量圖
        compass(u, v, 'b-o');  % 羅盤圖橫坐標u縱坐標v
        compass(Z, 'b-o');  % 羅盤圖復向量Z
        feather(u, v, 'b-o');  % 羽毛圖橫坐標u縱坐標v
        feather(Z, 'b-o');  % 羽毛圖復向量Z
        quiver(x, y, u, v);  % 以(x, y)為起點(u, v)為終點向量場圖
    %極坐標圖
        % polar(theta, rho, 'b-o');  % 極角theta, 半徑rho
        theta = -pi:0.01:pi;
        rho = sin(theta);
        polar(theta, rho, 'b')
    %對數坐標圖
        semilogx(x1, y1, 'b-o');  % 把x軸對數刻度表示, semilogy是y軸對數刻度表示,loglog是兩個坐標都用對數表示
    %雙縱坐標
        plotyy(x1, y1, x2, y2, 'fun1', 'fun2');  % fun規定了兩條條線的繪制方式,如plot,semilogx,semilogy,loglog,stem等
    %函數繪圖
        f = 'sin(2*x)';
        ezplot(f, [0, 2*pi]);  % 繪制f並規定橫坐標范圍,也有[xmin, xmax, ymin, ymax]
        x = '2*cos(t)';
        y = '4*sin(t)';
        ezplot(x, y);  % 繪制x(t),y(t)在[0, 2*pi]圖像, 也可以在最后用[tmin, tmax]規定t的范圍

3.3 三維曲線曲面

%三維曲線曲面繪制
    %三維曲線
        x = 0:0.1:2*pi;
        y = sin(x); z = cos(x);
        plot3(x, y, z, 'b-*');
    %三維曲面
        %三維網格
            x = -5:0.1:5;  % 規定了x軸采樣點,也規定了x軸范圍
            y = -4:0.1:4;  % 規定了y軸采樣點,也規定了y軸范圍
            [X, Y] = meshgrid(x, y);  % 得到了xoy面網格點
            Z = X.^2+Y.^2;
            mesh(X, Y, Z)  % XY是meshgrid得到的網格點,Z是網格頂點,c是用色矩陣可省略
        %三維表面圖
            x = -5:0.1:5;  
            y = -4:0.1:4;
            [X, Y] = meshgrid(x, y);
            Z = X.^2+Y.^2;  % 以上部分同上
            surf(X, Y, Z)  % 與上一個類似

learn_matlab-1635842028124-2021112163348.png

4. 多項式

4.1 多項式

%多項式
    %創建
        p = [1, 2, 3, 4];  % 系數向量,按x降冪排列,最右邊是常數
        f1 = poly2str(p, 'x');  % 生成好看的字符串 f1 = x^3 + 2 x^2 + 3 x + 4,不被認可的運算式
        f2 = poly2sym(p);  % 生成可用的符號函數 f2 = x^3 + 2*x^2 + 3*x + 4
    %求值
        x = 4;
        y1 = polyval(p, x);  % 代入求值;若x1為矩陣,則對每個值單獨求值
    %求根
        r = roots(p); % p同上,由系數求根,結果為根植矩陣
        p0 = poly(r);  % 由根求系數,結果為系數矩陣

4.2 數據插值

%數據插值
    %一維插值
        %yi = interp1(X, Y, xi, 'method')
        X = [-3, -1, 0, 1, 3];
        Y = [9, 1, 0, 1, 9];  % XY為已知點橫縱坐標向量
        y2 = interp1(X, Y, 2);  % 差值預估在x=2的y的值,x不能超過已知范圍(此處x<3)
        y2m = interp1(X, Y, 2, 'spline');  % 用spline方法(三次樣條)差值預估在x=2的y的值
    %二維插值
        %zi = interp1(X, Y, Z, xi, yi, 'method')

learn_matlab-1635843214301-2021112165334.png

4.3 數據統計

X = [2, 3, 9, 15, 6, 7, 4];
A = [1, 7, 2; 9, 5, 3; 8, 4 ,6];
B = [1, 7, 3; 9, 5, 3; 8, 4 ,6];

注意:matlab矩陣默認按列存儲,下列求均值、中值的默認是求一列的均值中值,需要加上加上參數2 后變成求一行的均值與中值

%數據統計
    %矩陣最大最小值
        y = max(X);  % 求矩陣X的最大值,min最小值
        [y, k] = max(X);  % 求最大值,k為該值的角標
        [y, k] = max(A, [], 2);  % A是矩陣,'2'時返回y每一行最大元素構成的列向量,k元素所在列;'1'時與上述相同
    %均值和中值
        y = mean(X);  % 均值
        y = median(X);  % 中值  第二個參數為空或者為 '1' 時,默認按列求,參數為 '2' 時 為按行求
        y = mean(A, 2);  % j'2'時返回y每一行均值構成的列向量;'1'時與上述相同
        y = median(A, 2);  % '2'時返回y每一行中值構成的列向量;'1'時與上述相同
    %排序
        Y = sort(A, 1, 'ascend');  % sort(矩陣, dim, 'method')dim為1按列排序,2按行排序;ascend升序,descend降序
        [Y, I] = sort(A, 1, 'ascend');  % I保留了元素之前在A的位置
    %求和求積累加累乘
        y = sum(X);  % 求和
        y = prod(X);  % 求積
        y = cumsum(X);  % 累加
        y = cumprod(X);  % 累乘

learn_matlab-1635900734926-202111385215.png

learn_matlab-1635900868051-202111385437.png

4.4 數值計算

%*數值計算
    %最(極)值
        %多元函數在給定初值附近找最小值點
        x = fminsearch(fun, x0);
    %函數零點
        x = fzero(fun, x0);  % 在給定初值x0附近找零點

5. 符號函數

5.1 符號對象創建

%符號對象創建
    %sym函數
        p = sin(pi/3);
        P = sym(p, 'r');  % 用數值p創建符號常量P;'d'浮點數'f'有理分式的浮點數'e'有理數和誤差'r'有理數
    %syms函數
        syms x;  % 聲明符號變量
        f = 7*x^2 + 2*x+9;  % 創建符號函數
    %符號運算
        % 加減乘除外
        % '轉置 ; ==相等 ; ~=不等
        % sin, cos, tan; asin, acos, atan 三角反三角
        % sinh, cosh, tanh; asinh, acosh, atanh 雙曲反雙曲
        % conj復數共軛;real復數實部;imag復數虛部;abs復數模;angle復數幅角
        % diag矩陣對角;triu矩陣上三角;tril矩陣下三角;inv逆矩陣;det行列式;rank秩;poly特征多項式;
        % |----expm矩陣指數函數;eig矩陣特征值和特征向量;svd奇異值分解;
    %符號對象精度轉換
        digits;  % 顯示當前用於計算的精度
        digits(16);  % 將計算精度改為16位,降低精度有時可以加快程序運算速度或減少空間占用
        a16 = vpa(sqrt(2));  % vpa括起的運算使sqrt(2) 開更號運算按照規定的精度執行
        a8 = vpa(sqrt(2), 8);  % 在vpa內控制精度,離開這一步精度恢復

5.2 符號多項式函數運算

%符號多項式函數運算
    %*符號表達形式與相互轉化
        %多項式展開整理
            g = expand(f);  % 展開
            h = collect(g);  % 整理(默認按x整理)
            h1 = collect(f, x);  % 按x整理(降冪排列)
        %因式分解展開質因數
            fac = factor(h);  % 因式分解
            factor(12);  % 對12分解質因數
    %符號多項式向量形式與計算
        syms a b c;
        n = [a, b, c];
        roots(n);  % 求符號多項式ax^2+bx+c的根
        n = [1, 2, 3];
        roots(n);  % 求符號多項式帶入a=1, b=2, c=3的根
    %*反函數
        fi = finverse(f, x);  % 對f中的變量x求反函數

5.3 符號微積分

%符號微積分
    %函數的極限和級數運算
        % 常量a,b
        %極限
            limit(f, x, 4);  % 求f(x), x->4
            limit(f, 4);  % 默認變量->4
            limit(f);  % 默認變量->0
            limit(f, x, 4, 'right');  % 求f(x), x->4+, 'left' x->4-
        %*基本級數運算
            %求和
                symsum(s, x, 3, 5);  % 計算表達式s變量x從3到5的級數和,或symsum(s, x, [a b])或symsum(s, x, [a;b])
                symsum(s, 3, 5);  % 計算s默認變量從3到5的級數和
                symsum(s);  % 計算s默認變量從0到n-1的級數和
            %一維泰勒展開
                taylor(f, x, 4);  % f在x=4處展開為五階泰勒級數
                taylor(f, x);  % f在x=0處展開為五階泰勒級數
                taylor(f);  % f在默認變量=0處展開為五階泰勒級數
    %符號微分
        %單變量求導(單變量偏導)
            n = 1;  % 常量n
            fn = diff(f, x, n);  % f對x的n階導
            f1 = diff(f, x);  % f對x的1階導
            diff(f, n);  % f對默認變量的n階導
            diff(f);  % 默認變量1階導
        %多元偏導
            fxy = diff(f, x, y);  % 先求x偏導,再求y偏導
            fxyz = diff(f, x, y, z);  % 先求x偏導,再求y偏導,再求z偏導
    %符號積分
        %積分命令
            int(f, x, 1, 2);  % 函數f變量x在1~2區間定積分
            int(f, 1, 2);  % 函數f默認變量在ab區間定積分
            int(f, x);  % 函數f變量x不定積分
            int(f);  % 函數f默認變量不定積分
            % 傅里葉,拉普拉斯,Z變換

5.4 符號方程求解

%*符號方程求解
    %符號代數方程
        %一元方程
            eqn1 = a*x==b;
            S = solve(eqn1);  % 返回eqn符號解
        %多元方程組
            eqn21 = x-y==a;
            eqn22 = 2*x+y==b;
            [Sx, Sy] = solve(eqn21, eqn22, x, y);  % [Svar1,...SvarN]=solve(eqn1,...eqnM, var1,...varN),MN不一定相等
            [Sxn, Syn] = solve(eqn21, eqn22, x, y, 'ReturnCondition', true);  % 加上參數ReturnCondition可返回通解及解的條件
            % 其他參數(參數加上true生效)
                % IgnoreProperty,忽略變量定義時一些假設
                % IgnoreAnalyticConstraints,忽略分析限制;
                % MaxDegree,大於3解顯性解;
                % PrincipleValue,僅主值
                % Real,僅實數解
        %非線性fsolve
            X = fsolve(fun, X0, optimset(option));  % fun函數.m文件名;X0求根初值;option選項如('Display','off')不顯示中間結果等

6. 例題

在 matlab 中按給定分布率產生隨機信號分析它們的特征。

  • 在matlab 新建腳本英語便攜高斯分布下隨機信號產生代碼
  • 設置采樣率為 5MHz ,采樣點數為 50K
  • 按均值為1,方差為1 的高斯分布產生隨機信號,打印出它的波形,分析他的概率密度,自相關函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM