matlab笔记

作者: VeyronC | 来源:发表于2017-01-07 20:13 被阅读357次

    显示中文帮助的方法

    预设→常规→帮助→在mathworks.com网站上(需要Internet连接)→语言(简体中文)


    /:右除。a/b表示矩阵a乘以矩阵b的逆。a/b == a * inv(b)

    \:左除。a\b表示矩阵a的逆乘以b。 a\b == inv(a) * b

    ./:右除。a./b表示矩阵a中的每个元素除以矩阵b的对应的元素。

    .\:左除。a.\b表示矩阵b中的每个元素除以矩阵a的对应的元素。

    .*点乘不是矩阵的乘法,是对应元素相乘。


    1 MATLAB系统环境与设置

    • path函数,可以查看搜索路径包含的所有路径。
    • cd返回当前目录。
    • userpath('路径名')更改工作目录。改好后用savepath保存路径。
    • pathtool是界面工具,设置搜索路径。

    2 MATLAB的数据操作及语法

    • matlab变量区分大小写,变量不声明,拿来即用。
    • 回车表示一句语句结束,语句末尾有分号,只执行,不输出在显示栏。无分号则输出执行结果。
    • 一行不够写的话,用...续行。
    • who显示在工作空间中滞留的变量名,whos给出变量更详细的信息。
    • clear命令清除工作空间中所有变量。clear a,清除变量a
    • 保存数据save [文件名] [变量名] [-append] [-ascii]
    • load [文件名] 载入变量文件
    • format数据输出格式控制,只影响输出格式,不影响计算和存储,默认为short格式。
    • class()查看括号里变量的数据类型。

    字符串

    • matlab中字符串使用单引号''括起来的。
    • double函数或abs函数可以获取字符的ASCII值。
    • char(63)输出ASCII码为63代表的字符。
    • 字符串与数值间互换str2num, num2str
    • eval('t=1')执行字符串中的语句,也就是t=1语句。
    eval()函数一个很好的功能就是可以自动生成一系列变量
    注意eval()中拼接字符串外面要加中括号!
    
    for x = 1:3
        eval(['a',num2str(x),' = 7'])
    end
    %% 相当于执行了下面三条语句
    a1 = 7
    a2 = 7
    a3 = 7
    
    • 想要让标题也自动编号,要注意在字符串内还想输出单引号'的话,需要打两个''
    for y = 1:2
       eval(['title(''test',num2str(y),''');']);
    end
    

    结构体

    • 结构体.成员名=表达式
    • issturct(a)判断a是不是结构体
    • fieldnames(a)返回a中所有成员的成员名,返回类型为字符串数组
    • isfield(a, 'x1')判断x1是不是a结构体中的成员。
    • rmfield删除结构体中某个成员。
    • getfield获得结构体中的某个成员

    Cell(单元或元胞)

    • 用大括号创建
      • a = {1, 'str', [11 22 33 44]}
    • 取元胞内容
      • 小括号()表示取出指定位置的元胞,还是个元胞,不能用于比较,否则很难找到错误。
      • 花括号 { } 取出的是元胞指定位置的内容,可以拿来做比较,或者借助 isempty 判断是否为空。eg:if(~isempty(tagcity{i,j}))
      • 假设a元胞的第二个元素为[]既空元素,那么isempty(a(2)) 返回0,是一个错误的结果。只有写isempty(a{2})才会返回1,得到正确的判断。

    3 MATLAB的矩阵操作

    • zeros函数建立0矩阵,幺矩阵ones函数建立元素全为1的矩阵。
    • 冒号表达式建立向量。
      • e1:e2:e3,其中e1位初始值,e2位步长,e3为结束
    • linspace(a, b, n)建立行向量,a和b分别为行向量的第一个和最后一个元素,n为总个数,省略n则默认是产生100个元素。

    矩阵索引

    • A(2, 3)获得A矩阵的第二行第三列的元素。
    • matlab矩阵存放是按列存的,先存完第一列,然后存第二列,也可以用单索引值索引。
    • find(A == 8)返回A矩阵中,值为8的元素的位置。
    • [m, n] = find(A == 8)返回的是行列索引的形式。
    • ind = find(A == 8)返回的是单值索引的形式。
    • 两种索引值的转换:ind = sub2ind(size(A), m, n)
    • [m, n] = ind2sub(size(A), 3)

    重排矩阵

    • reshape(A, 9, 1)将A重新排列为9行1列的向量。转换成列向量,也可以这样H = A(:):这个执行效率更高。
    • 矩阵转置用一个单引号‘

    矩阵拆分

    • 获得矩阵中某行某列的部分内容。
    • M = A(1, :)获得A矩阵中第一行的所有内容。
    • M = A(1, 1:2)获得A矩阵的第一行中的第一列到第二列
    • M = A(1, 1:end)获得A矩阵的第一行中的第一列到最后一列
    • M = A(1, 1:end - 1)获得A矩阵的第一行中的第一列到倒数第二列
    • M = A([1 2], [1 2])获得A矩阵中的第一行第一列,第一行第二列,第二行第一列,第二行第二列。
    • P = A(2:3, 1:3)和P = A([2 3], [1 2 3])效果一样。

    删除矩阵元素

    • 若M是一个一维向量,M(2) = []删除了M的第二个元素。
    • A(1, :) = []删除A矩阵的第一行所有元素。
    • 上面方法可以看成索引矩阵的赋[]值操作。

    扩展矩阵

    • Q = repmat(A, 2, 2),将矩阵A看着一个大整体元素,然后复制成两行两列。

    压缩矩阵,去除重复元素

    • S = unique(R)去除R中重复的元素,但重新排序了。unique还有其他使用形式可查看help。
    • unique(R,'stable'),去重且不重新排序。

    4 MATLAB矩阵处理基础

    特殊矩阵建立
    矩阵和向量运算
    线性方程组求解
    矩阵的相似化简和分解
    矩阵和向量的范数
    矩阵分析

    • 单位矩阵函数eye

    • 随机矩阵函数rand

    • 从0到10间均匀分布,s = 0 + (10 - 0) * rand(10,1)

    • 从a到b直接均匀分布的随机数S = a + (b - a) * rand

    • randn产生均值为0,方差为1的随机数。

    • 产生均值为u,方差为s的正态分布的随机矩阵, y = u + sqrt(s)*randn

    • mean获得序列的均值

    • std获得序列的方差

    • 魔方矩阵用magic函数

    • Hilbert矩阵用hilb函数,每个位置的元素为1/(i + j)

    • Toeplitz矩阵用toeplitz函数

    • 求矩阵A行列式的值det(A)

    • 如果行列式的值不为0 ,则可求矩阵的逆inv(A)

    • 复数可以直接用i或j表示

    • b的共轭可以用conj(b)函数,如果是复数向量直接用转置b'也表示共轭

    • 内积运算可用dot()函数

    • 若a,b为两个同纬行向量,这三个等式结果一致:

    • s = sum(conj(b).*a)

    • s = a*b'

    • s = dot(b, a)

    线性方程组的求解,也可以用左除运算符,效率比较高。

    A = [1, 2, 3; 1, 4, 9, 1 8 27];
    b = [5, -2, 6]'
    x = inv(A)*b
    x = A\b    %%解出结果与上一行相同
    
    • 用jordan(A)获得矩阵A的约旦标准型。

    • [V J] = jordan(A) 得到V为A的相似变换矩阵,J就是约旦标准型。

    • eig函数可以获得矩阵的特征值。

    • [E D] = eig(A) 得到E为特征向量,D中主对角线为特征值其余为0。

    • 1范数,2范数,无穷范数以及f范数,都统一使用norm函数。

    norm(A, 1)      %1范数
    norm(A, 2)      %2范数
    norm(A, inf)    %无穷范数
    norm(A, 'fro')  %f范数
    

    矩阵分析:

    • MATLAB中函数的计算,比如求导数,默认是对每个元素求导。

      • 求导函数diff(A)
      • 求二阶导数diff(A, 2)
    • 建立符号x,类似于代数。

      • syms x
    • 矩阵函数,计算矩阵函数eA,sinA,cosA,使用funm函数,使用方法如下:

    S = funm(A, @fun);

    A = [0 1; 0 -2];
    expA = funm(A, @exp)
    expA = expm(A)  %结果同上
    sinA = funm(A, @sin)
    cosA = funm(A, @cos)
    

    5 MATLAB程序控制结构

    • M文件分类:命令文件(Script File)、函数文件(Function File)。
    • 命令文件没有输入,没有返回;命令文件可以对工作空间的变量操作,结果返回工作空间,而函数文件中的变量为局部变量,函数执行完毕,变量被清除。

    顺序结构

    • 用于顺序结构中的输入和输出(命令交互):
      • 数据输入(input函数)
      • 数据显示(disp函数)
      • 程序暂停(pause函数),设计界面动画时候经常使用。

    分支(选择)结构

    • y = cos(x(find(x < 10)));这样写没有用分支结构,直接用了索引找到所有x向量中x值小于10的下标,然后对这些数据进行求余弦操作。
    x = input('x');
    if x < 10
        y = log(x);
    else
        y = cos(x);
    end
    
    %多分支if语句
    c = input('input a character', 's');
    if c >= 'A' & c <= 'Z'
        disp(char(abs(c) + abs('a') - abs('A')));
    elseif c >= 'a' & c <= 'z'
        disp(char(abs(c) - abs('a') + abs('A')));
    elseif c >= '0' & c <= '9'
        disp(c);
    end
    
    %switch分支,在1000不同价格范围有不同的折扣rate
    price = input('input price');
    switch fix(price/100)
        case {0, 1}   %可以用单元结构表示当判断条件为0或1的时候
            rate = 0;
        case {2, 3, 4}
            rate = .03;
        case {5, 6, 7, 8, 9}
            rate = .05;
        otherwise
            rate = .1; 
    end
    
    • try是试探性的分支语句,也就是如果这条语句执行有错误,则不执行,或者执行其他的语句,提高了程序的容错性能。如果下面语句组1有错误,则执行语句组2。
    try
        语句组1
    catch           %可没有
        语句组2    %可没有
    end
    
    • 比如需要删除某个变量,但是不知道这个变量有没有,如果直接使用clear或者delete命令,那么这个变量有的话可以,如果这个变量没有呢,那么就出错了,程序就终止了,在一个大程序中,这样是不利的。

    循环结构

    • for循环的常用语法如下,当然也可以for 循环变量 = 矩阵,这样每次循环,矩阵的每一列就会进入循环体一次。
    for 循环变量 = 表达式1:表达式2:表达式3
        循环体
    end
    
    • 注意循环变量自动增加,在循环体内不要对循环变量进行赋值操作,否则结果不可预料。
    • matlab中的for循环中最好不使用i,j做循环变量。
    % for循环
    A = 1:100;
    sumA = 0;
    for k = 1:100
        sumA = sumA + A(k);
    end
    
    • while循环
    while 条件
        循环体
    end
    
    %while循环,下面实现输入字符再输入回车继续执行,直接输入回车退出循环
    while 1
        c = input('input a character', 's')
        if isempty(abs(c))  %isempty函数判断是否为空,输入回车也是空
            break;
        end 
    end
    
    • matlab中要避免使用两重以上循环,否则效率很低。
    • 怎样避免使用循环和提高循环效率?
      • ★有些可以通过matlab的矢量化语言,通过矩阵或者向量操作完成。
      • ★有些可以通过matlab提供的一些特殊工具箱函数完成。
      • ★预分配的使用,会大大增加循环效率。

    6 MATLAB的编辑器和程序调试

    函数文件

    function [输出形参] = 函数名([输入形参])
    [注释说明]     %用help或lookfor查看函数帮助即显示这部分内容
    函数体
    
    • 通常函数文件名和函数名一致,如果不一致,忽略函数名,调用时使用函数文件名。
    • 选中多行内容可以用Ctrl+R注释,用Ctrl+T取消注释。

    函数参数可调标识变量

    nargin
    nargout
    varargin
    varargout

    • 可以完成传递参数的可调功能,类似于其它高级语言中的函数重载和多态。
    • 前两者为输入输出参数个数,后两个可以代表未知的输入输出变量。
    function re = add_multi(a, b, c, d)
    %输入参数可调的函数范例
    if nargin == 4
        re = a + b + c + d;
    elseif nargin == 3
        re = a + b + c;
    elseif nargin == 2
        re = a + b;
    else
        error('wrong');
    end
    
    function [a, b] = add_mu(c, d, e, f)
    %输出参数可调范例
    if nargout == 2
        a = c + d + e + f;
        b = c * d * e * f;
    else
        a = c + d + e + f;
    end
    
    function re = add_var(a, b, varargin)
    %输入参数个数未知范例
    if nargin == 2
        re = a + b;
    elseif nargin == 3    
        c = varargin{1}; %用元胞数组来操作
        re = a + b + c;
    else
        re = a + b;
        for k = 1:(nargin-2)
        re = re + varargin{k};
        end
    end
    
    • error(nargchk(2, 4, nargin)),检测参数输入范围最小两个,最大4个,如果不是这个范围则输出错误信息。
    • 关于varargout的用法可以参考工具箱函数,输入edit pburg可以看。

    全局变量

    • 使用global声明,可以提供不同的M文件访问同一个变量。在每个文件中都要声明。

    调试

    • >>执行状态,K>>调试状态

    7 MATLAB绘图功能(1) 二维高层绘图操作

    • 基本函数plot

    • 二维绘图的辅助操作:

      • 标注(图形名称,坐标轴名称,曲线标注,图例)
      • 坐标轴控制
      • 图形保持(同一坐标轴绘制多个图形)
      • 窗口分割(同一个窗口有多个坐标轴)
    • plot(x, y)基本要求:x和y为相同长度的向量,但也有特殊用法:

      • x为向量,y为矩阵,其中一维与x长度相同,则绘制多条不同颜色的曲线(颜色确定涉及到底层绘图操作)
      • x和y为同维矩阵,以对应列绘制不同色彩的曲线
      • 若plot只有一个参数,若x为实数向量,则绘制折线图;若为复数向量,则以实部和虚部为横纵坐标绘图
      • 多个输入参数
      • 曲线选项
    % 基本绘图操作,绘制一个正弦函数
    x = 0:0.01:2*pi;
    y = sin(x);
    plot(x, y);
    % y是矩阵的情况
    y1 = sin(x);
    y2 = cos(x);
    z = [y1; y2];
    plot(x, z);
    

    %两个参数都是矩阵
    x1 = 0:0.01:2*pi;
    x2 = -pi:0.01:pi;
    x = [x1; x2];
    y1 = cos(x1);
    y2 = sin(x2);
    y = [y1; y2];
    plot(x, y);
    

    % 上面是使用了每列进行绘图,这样绘制了很多条曲线。
    % 如果想要使用每一行来绘图,
    % 那么需要将x和y进行转置,
    % 就绘制了一条从0到2π的余弦,
    % 一条从-π到π的正弦
    x1 = 0:0.01:2*pi;
    x2 = -pi:0.01:pi;
    x = [x1; x2]';
    y1 = cos(x1);
    y2 = sin(x2);
    y = [y1; y2]';
    plot(x, y);
    

    % plot只有一个参数
    x = linspace(0, 2*pi, 200);
    y = sin(x);
    plot(y);   %绘出正弦
    y2 = cos(x);
    y3 = y + i*y2;
    plot(y3);  %绘出一个椭圆,坐标轴控制axis equal命令可变成一个圆
    
    % plot只有多个参数
    x1 = linspace(0, 2*pi, 200);
    x2 = linspace(0, 2*pi, 100);
    y1 = cos(x1);
    y2 = sin(x2);
    plot(x1, y1, x2, y2);  %不同长度的曲线同时绘制
    
    % plot含有的曲线选项
    plot(x, y, 'k');   %r红色,k黑色,g绿色,y黄色,m品红,b蓝色
    plot(x, y, '*');   %用'*'来绘图,是离散的图。同理.是点,'p'是五角星,'<' ,'>'是三角星,'--'虚线,'-.'是线和点,':'很小的虚线
    plot(x, y, 'r*');  %颜色和线型的结合
    
    %图形标注
    plot(x , y);
    xlabel('x');
    ylabel('y');
    title('正弦');
    text(2, 0.3, 'y = sin(x)');  %在某个位置显示字符串
    legend('cos', 'sin');  %绘制图例
    
    • matlab中可以用LaTex字符,字符串'x_2'显示出来是x2

    坐标轴控制

    • axis equal
    • axis square
    • axis auto
    • axis off
    • axis on
    • axis([xmin xmax ymin ymax])
    • xlim([xmin xmax])
    • ylim([ymin ymax])

    图形保持

    • hold on
    • 关闭图形保持hold off

    窗口分割

    %窗口分割
    x = 0:0.1:2*pi;
    y1 = sin(x);
    y2 = cos(x);
    y3 = tan(x);
    y4 = exp(x);
    subplot(2, 2, 1)  %将窗口分成两行两列4格,绘制第一格
    plot(x, y1);
    subplot(222)  %绘制第二格
    plot(x, y2);
    subplot(223)
    plot(x, y3);
    subplot(224)
    plot(x, y4);
    

    8 MATLAB绘图功能(2) 二维底层绘图修饰

    • matlab把构成图形的各个基本要素称为图形对象,产生每一个图形对象时,matlab会自动分配一个唯一的值用于表示这个对象,称为句柄。
    • 对象间基本关系:计算机屏幕 → 图形窗口 → (用户菜单,用户控件,坐标轴)
    • 坐标轴 → (曲线,曲面,文字,图像,光源,区域,方框)
    • line函数普通用法和plot相同 h = line([-pi:0.01:pi], sin([-pi:0.01:pi]));
    hl = line('XData', [-pi:0.01:pi], 'YData', sin([-pi:0.01:pi]),...
        'LineWidth', 1, 'LineStyle', ':', 'Color', 'r');
    
    hl = line('XData', [-pi:0.01:pi], 'YData', sin([-pi:0.01:pi]),...
        'LineWidth', 1, 'LineStyle', ':', 'Color', 'r');
    set(hl, 'LineWidth', 2, 'Marker', 'p', 'MarkerSize', 15);
    
    • text对象返回一个句柄后。也可以用set来更改设置。修饰属性: Color,String, FontSize,Rotation。

    底层坐标轴控制

    • axes对象和axes函数
    • 修饰:
      • Box属性,
      • GridLineStyle属性,网格的线型,默认是虚线
      • Position属性
      • Units属性,当该属性为normalized时,子窗口随父窗口变化而变化。
      • XLabel、YLabel和ZLabel属性
      • Xlim、Ylim和Zlim属性
    ha = axes;
    get(ha)   %获得坐标轴属性
    
    hf = figure;
    ha = axes('Parent', hf, 'Unit', 'normalized', 'Position', [.1 .1 .6 .5]);
    

    9 MATLAB Notebook使用简介

    • 方便matlab代码直接移到word,方便写文档。
    • 在Notebook中,需要运行的代码部分要设置为“输入单元”,使用绿色加粗Courier New字体显示;
    • 定义输入单元,可以使用Notebook菜单,或者组合键“Alt+D”;
    • 定义输入单元之后,选择Notebook菜单中的“Evaluate Cell”或者组合键“Ctrl+Enter”执行单元,输出直接在相应输入单元之后显示,使用蓝色Courier New字体显示。
    • 自动初始化单元可以在打开Notebook时自动执行,这样可以快速恢复所需要的工作空间。
    • 定义方式:选择需要定义的单元,选择Notebook菜单中的“Define AutoInit Cell”。
    • 定义为自动初始化的单元使用蓝色加粗Courier New字体显示

    10 MATLAB符号运算

    • 符号计算基础
      • 符号常量和符号变量
      • 符号四则运算
      • 符号表达式的化简
      • 符号矩阵运算
    • 符号函数
      • 极限
      • 微分
      • 积分
    • 符号级数
    • 符号方程求解
      • 代数方程
      • 微分方程
    a = sym('a');  %符号变量
    syms a;        %同上
    c = sym('3');  %符号常量
    
    f1 = '3 * x + 4';
    class(f1)      %得到类型为char
     
    syms x
    f2 = 3 * x + 4;
    class(f2)      %得到类型为sym
     
    f3 = sym('3 * y + 4');
    class(f3)      %得到类型为sym
     
    f4 = f1 + f2;   %得到f4 = 6*x + 8
    class(f4)       %得到类型为sym
    
    • 符号四则运算有 + - * / ^

    符号表达式化简

    • simplify
    • simple用了很多规则来化简,都列了出来,包含simplify

    符号表达式与数值的转化用

    • sym 数值转化为符号
    • eval 将符号变量转化为数值变量

    符号表达式的分解展开合并

    • factor因式分解
    • expand因式展开
    • collect合并同类项
    syms a b x y;
    f1 = a^3 - b^3;
    factor(f1)    %得到[ a - b, a^2 + a*b + b^2]
    f2 = (3*x^2 + 8*y^2)*(-x^2 + 3*y);
    expand(f2)    %得到- 3*x^4 - 8*x^2*y^2 + 9*x^2*y + 24*y^3
    f3 = 3*x^2 + 4*x^2 + 5*x^2*y;
    collect(f3)   %得到(5*y + 7)*x^2
    

    符号矩阵

    • 构建方式与数值矩阵一致
    • 转置和行列式:transpose determ
    • 其它使用在数值矩阵中的函数也可以直接用于符号矩阵
    • 注意:
      • 用transpose(A)的转置相当于AT
      • 直接使用单引号‘的转置相当于A的共轭转置,即AH

    符号函数

    • 用符号函数计算得到的结果类型是sym,如果还需要数值用eval转换一下!
    syms x
    f1 = x^3 - 9;
    subs(f1, 3)  %用3来代替原来f1中符号的位置来计算
     
    y = (sin(x + a) - sin(x - a)) / x;
    limit(y, 0)  %求极限,当x趋于零时,y的值
     
    y2 = sqrt(1 + exp(x));
    diff(y2)     %求解差分
    diff(y2, 2)  %求解2阶导数
    diff(y2, 3)  %求解3阶导数
     
    y3 = (3 - x^2)^3;
    int(y3)     %求解不定积分
     
    y4 = abs(1 - x);
    int(y4, 1, 2)  %求解定积分
    

    符号级数

    • 符号级数求和symsum,泰勒级数taylor
    syms n
    f = 1/n^2;
    s1 = symsum(f, n, 1, inf)  %4个参数意义依次是:第一是通项,第二个规定哪个参数作为求和变量,第三第四参数表示在求和范围
    
    % 泰勒展开
    syms x
    y = (1 + x + x^2)/(1 - x + x^2);
    taylor(y,'order',6)
    

    符号方程求解

    • 符号代数方程和方程组solve
    • 符号常微分方程dsolve,其中D3y表示与的三阶导数,Dy表示y的一阶导数。
    % 方程组,可用=号形式,也可移项到等号同意一边,表示等于0
    [x y] = solve('1/x^3 + 1/y^3 = 28', '1/x + 1/y -4', 'x, y')
    
    % 微分方程
    dsolve('Dy - (x^2 + y^2)/x^2/2', 'x')
    

    参考《MATLAB基础视频》 作者:lskyp

    相关文章

      网友评论

        本文标题:matlab笔记

        本文链接:https://www.haomeiwen.com/subject/etwfbttx.html