MATLAB常用代码(完结)

1.退出MATLAB
    关闭MATLAB桌面
    在命令窗口执行quit或exit命令

2.开平方-sqrt(x)

3.指数函数exp(x)

4.clc清除窗口显示内容的命令

5.who、whos命令用来清除工作空间的变量

6.clear命令用来清除工作空间的变量

7.dir显示当前工作目录的文件和子目录清单

8.cd显示或设置当前工作目录

9.type显示指定m文件的内容

10.help或doc获取在线帮助

11.求方程2x^5-3x^3+71x^2-9x+13=0的全部跟
    >> p=[2,0,-3,71,-9,13];
    >> x=roots(p);

12.求解线性方程组2x+3y-z=2
         8x+2y+3z=4
         45x+3y+9z=23
    >> a=[2,3,-1;8,2,3;45,3,9];%建立系数矩阵a
    >> b=[2,4,23]%建立列向量b
    >> x=inv(a)*b

13.求解积分0->1xln(1+x)
    >> quad('x.*log(1+x)',0,1)

14.多项式曲线拟合
    >> x=[1,2,3,4,5,6,7,8,9,10];
    >> y=[1,2,3,4,5,4.7,5,5.2,6,7.2];
    >> p1=polyfit(x,y,1)%一次多项式拟合
    >> p3=polyfit(x,y,3)%三次多项式拟合
    >> x2=1:0.1:10;
    >> y1=polyval(p1,x2);
    >> y3=polyval(p3,x2);
    >> plot(x,y,'*',x2,y1,':',x2,y3)

15.函数linspace(x1,x2,n)
    >> x=linspace(1,2,5)

    x =

            1.0000    1.2500    1.5000    1.7500    2.0000

16.ones(生成全1的矩阵)、zeros(生成全0的矩阵)
    >> ones(3)
    >> ones(3,4)

17.函数reshape()
    >> a=-4:4
    >> reshape(a,3,3)

18.画出y=1/(x+1)的函数曲线,x∈[0,100]
    >> x=0:100;
    >> y=1./(x+1);
    >> plot(x,y);
    >> legend('y=1/(x+1)');
    
19.生成一个信号x=sin(2*pi*t)+sin(4*pi*t)
    >> t=[0:199]./100;%采样时间点
    >> x=sin(2*pi*t)+sin(4*pi*t);%生成信号
    >> plot(t,x);
    >> legend('sin(2*pi*t)+sin(4*pi*t)');

20.判断方阵中的元素能否被3整除
    >> A=[24,35,13;23,39,47;90,41,80];
    >> P=rem(A,3)==0%被3整除,求余

21.在[0,3π]区间,求y=sinx的值。要求消去负半波,即[π,2π]区间内的函数值置零。
    >> x=0:pi/100:3*pi;
    >> y=sin(x);
    >> y1=(y>=0).*y;%消去负半波
    >> plot(y1);

22.求向量的最大值
    >> x=[-43,72,9,16,23,47];
    >> y=max(x)%求向量x中的最大值
    >> [y,I]=max(x)%求向量x中的最大值及其该元素的位置

23.求矩阵的最大值
    >> A=[24,35,13;23,39,47;90,41,80];
    >> y=max(A)%求矩阵A中每列的最大值
    >> [y,I]=max(A)%求矩阵A中每列的最大值及其该元素的位置
    >> r2=max(A,[],2)%求矩阵A中每行的最大值

24.数据分析与统计
    sum(x):返回向量x各元素的和;
    prod(x):返回向量x各元素的乘积;
    sum(x):返回一个行向量,其第i个元素是A的第i列的元素和;
    prod(A):返回一个行向量,其第i个元素是A的第i列的元素乘积;
    sum(A,dim):当dim为1时,该函数等同于sum(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的各元素之和;
    prod(A,dim):当dim为1时,该函数等同于prod(A);当dim等于2时,返回一个列向量,其第i个元素是A的第i行的各元素乘积;
    mean(x):返回向量x的算术平均值;
    median(x):返回向量x的中值;
    mean(A):返回一个行向量,其第i个元素是A的第i列的算术平均值;
    median(A):返回一个行向量,其第i个元素是A的第i列的中值;
    mean(A,dim):当dim为1时,该函数等同于mean(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的算术平均值;
    median(A,dim):当dim为1时,该函数等同于median(A);当dim为2时,返回一个列向量,其第i个元素是A的第i行的中值;

25.数组元素的标识与寻访
    size函数返回变量的大小,即变量数组的行列数;
    length函数返回变量数组的最大维数;
    sub2ind函数-双下标转换为单下标;>> sub2ind(size(A),2,2)
    ind2sub函数-单下标转换为双下标;>> IND=sub2ind(size(A),2,2);>> [I,J]=ind2sub(size(A),IND)
  

26.单下标的使用
    >> a=zeros(2,5);
    >> a(:)=-4:5

    a =

            -4    -2     0     2     4
           -3    -1     1     3     5

27.一维数组元素与子数组的寻访与赋值
    >> a=linspace(1,10,5)

    a =

          1.0000    3.2500    5.5000    7.7500   10.0000

    >> a(3)%寻访a的第3个元素

    ans =

            5.5000

    >> a([1 2 5])%寻访a的第1、2、5个元素组成的子数组

    ans =

            1.0000    3.2500   10.0000
    >> a(1:3)%寻访前3个元素组成的子数组

    ans =

            1.0000    3.2500    5.5000

    >> a(3:-1:1)%由前3个元素倒序构成的子数组

    ans =

            5.5000    3.2500    1.0000

    >> a(3:end)%第3个元素及其后的所有元素构成的子数组

    ans =

            5.5000    7.7500   10.0000

    >> a(3:end)%第3个元素及其后的所有元素构成的子数组,end作为参数使用,返回最后一个元素的下标

    ans =

            5.5000    7.7500   10.0000
    >> a([1 2 3 5 5 3 2 1])%数组元素可以被任意重复访问,构成长度大于原数组的新数组。

    ans =

            1.0000    3.2500    5.5000   10.0000   10.0000    5.5000    3.2500    1.0000
    >> a(3)=0%修改数组a的第3个元素值为0

    a =

          1.0000    3.2500         0    7.7500   10.0000

    >> a([2 5])=[1 1]%可以修改指定数组元素的值,一次可以修改多个数组元素的值,要修改的数组元素的个数应与送入数组的元素个数相同

    a =

          1.0000    1.0000         0    7.7500    1.0000
28.二维数组元素与子数组的寻访与赋值
    >> a_2=zeros(2,4)%创建2*4的全0数组

    a_2 =

             0     0     0     0
             0     0     0     0

    >> a_2(:)=1:8

    a_2 =

             1     3     5     7
             2     4     6     8

    >> a_2([2 5 8])%单下标方式寻访多个元素

    ans =

             2     5     8

    >> a_2([2 5 8])=[10 20 30]

    a_2 =

             1     3    20     7
            10     4     6    30

    >> a_2(:,[2 3])=ones(2)%双下标方式寻访并修改

    a_2 =

             1     1     1     7
            10     1     1    30
29.字符串
    >> str1='I like MATLAB,';%建立字符串str1
    >> str2='Java,and Python!';%建立字符串str2
    >> str3=[str1 str2]%直接连接str1及str2,进而建立str3

    str3 =

    I like MATLAB,Java,and Python!
    >> sentence='I ''ve got a date!';%如果输入的字符串中有单引号,则由两个连续的单引号来表示
    >> length(sentence)%计算字符串sentence的长度

    ans =

            17

    >> sentenceAscii=double(sentence)%查看字符串sentence的ASCII码

    sentenceAscii =

            73    32    39   118   101    32   103   111   116    32    97    32   100    97   116   101    33

    >> sentence2=char(sentenceAscii)%将ASCII码恢复成字符串形式

    sentence2 =

        I 've got a date!
    >> Chinese='今日事,今日毕';
    >> out1=class(Chinese)%out1的值是“char”

    out1 =

    char

    >> out2=ischar(Chinese)%out2的值是1,代表Chinese是字符串变量

    out2 =

             1

    >> x=Chinese+1;
    >> out3=ischar(x)%out3的值是0,代表x不是字符串变量

    out3 =

             0
30.字符串的比较
    >> str1='today';
    >> str2='tomorrow';
    >> str3='today';
    >> out1=strcmp(str1,str2)%比较字符串str1和str2

    out1 =

             0

    >> out2=strcmp(str1,str3)%比较字符串str1和str3

    out2 =

             1
31.数组维数的减小
    >> a=magic(4),a(:,2)=[]

    a =

        16     2     3    13
         5    11    10     8
         9     7     6    12
         4    14    15     1


    a =

        16     3    13
         5    10     8
         9     6    12
         4    15     1

    >> a(1,2)=[]
    带有下标的赋值维度不匹配。
 
    >> a(2:4)=[]%数组a将变为向量
    a =

        16     3    10     6    15    13     8    12     1
32.元胞数组的创建
    Cell indexing方式创建元胞数组
    >> c(1,1)={[1 4 3;0 5 8;7 2 9]}

    c = 

        [3x3 double]

    >> c(1,2)={'Anne Smith'}

    c = 

        [3x3 double]    'Anne Smith'

    >> c(2,1)={3+7i}

    c = 

          [3x3 double]    'Anne Smith'
        [3.0000 + 7.0000i]              []

    >> c(2,2)={-pi:pi/10:pi}

    c = 

          [3x3 double]    'Anne Smith' 
        [3.0000 + 7.0000i]    [1x21 double]

    >> class(c)

    ans =

    cell
    
    Content indexing方式创建元胞数组
    >> b{1,1}='James'

    b = 

        'James'

    >> class(b)

    ans =

    cell

    >> b{1,2}=[1 2;3 4;5 6]

    b = 

        'James'    [3x2 double]

    >> b{2,1}=pi

    b = 

        'James'     [3x2 double]
        [3.1416]              []

    >> b{2,2}=zeros(5)

    b = 

        'James'     [3x2 double]
        [3.1416]    [5x5 double]
33.元胞数组的连接
    >> a=[b c]

    a = 

        'James'     [3x2 double]          [3x3 double]    'Anne Smith' 
        [3.1416]    [5x5 double]    [3.0000 + 7.0000i]    [1x21 double]

    >> a=[b;c]

    a = 

        'James'               [3x2  double]
        [          3.1416]    [5x5  double]
          [3x3 double]    'Anne Smith' 
        [3.0000 + 7.0000i]    [1x21 double]

34.显示元胞数组的内容
    >> a(2,2)={-pi:pi/10:pi}

    a = 

          [3x3 double]    'Anne Smith' 
    [3.0000 + 7.0000i]    [1x21 double]

    >> celldisp(a)%显示全部内容
 
    a{1,1} =
 
             1     2     3
             4     5     6
             7     8     9

 
 
    a{2,1} =
 
           3.0000 + 7.0000i

 
 
    a{1,2} =
 
        Anne Smith
 
 
    a{2,2} =
 
          Columns 1 through 11

           -3.1416   -2.8274   -2.5133   -2.1991   -1.8850   -1.5708   -1.2566   -0.9425   -0.6283   -0.3142         0

          Columns 12 through 21

            0.3142    0.6283    0.9425    1.2566    1.5708    1.8850    2.1991    2.5133    2.8274    3.1416

 
    >> cellplot(a)%图形方式显示元胞数组的结构
    >> a{1,2}%使用内容下标索引显示指定元胞的数据

    ans =

    Anne Smith

    >> a{:}%一次显示a的全部数据

    b = 

    'James'     [3x2 double]
    [3.1416]    [5x5 double]

    >> b,d=b{1,2}%读取b元胞数组的第1行、第2列元胞的内容

    b = 

        'James'     [3x2 double]
        [3.1416]    [5x5 double]


    d =

         1     2
         3     4
         5     6

    >> e=b{1,2}(3,1)%读取b{1,2}的第3行、第1列的数据

    e =

             5

    >> f=a(1,:)%读取元胞数组a第一行的所有元胞

    f = 

            [3x3 double]    'Anne Smith'

    >> a(1,:)=[]%删除元胞数组a第一行的所有元胞

    a = 

            [3.0000 + 7.0000i]    [1x21 double]

35.结构数组变量的创建
    方法一:直接键入
    Exam:创建一个关于学生信息的结构数组,每个结构包含学生姓名(name)、学号(id)、成绩(scores)。
    >> clear student%清除student变量
    >> student.name='张三';%加入name字段
    >> student.id='mr871912';%加入id字段
    >> student.scores=[58,75,62];%加入scores字段
    >> student%显示结构变量的数据

    student = 

              name: '张三'
            id: 'mr871912'
            scores: [58 75 62]
    >> student(2).name='张宁';
    >> student(2).id='mr871913';
    >> student(2).scores=[68,85,92];
    >> student

    student = 

    1x2 struct array with fields:

            name
            id
            scores

    >> student(1)

    ans = 

              name: '张三'
            id: 'mr871912'
            scores: [58 75 62]
    
    方法二:struct函数
    格式:Structure Array_var_name=struct(field1,value1,field2,value2,...),field1、field2、...是结构的字段名,value1、value2、...
则是相应字段所包含的数据。
    Exam:使用struct创建结构数组变量
    >> clear student
    >> student=struct('name','张听说','scores',[50 60]);
    >> student(2)=struct('name','张延安','scores',[60 70]);
    >> student(1),student(2)
    Exam:使用struct创建结构数组变量(一次建立多个元素)
    >> clear student
    >> student=struct('name',{'张婷说','张延安'},'scores',{[50 60],[60 70]});
    >> student(1),student(2)

    ans = 

              name: '张婷说'
            scores: [50 60]


    ans = 

              name: '张延安'
            scores: [60 70]

36.结构数组嵌套:结构数组中结构的字段还可以是结构
    >> student(2).course(1).title='Web Programming';
    >> student(2).course(1).credits=2;
    >> student(2).course(2).title='Numerical Method';
    >> student(2).course(2).credits=3;
    >> student(2).course

    ans = 

    1x2 struct array with fields:

        title
        credits
    >> student(1).name='Newton';%修改结构数组变量的字段值
    >> student(1).name

    ans =

        Newton

37.cat函数:排列结构数组某字段的值
    格式:cat(dim,structurefield),dim=1,竖排;dim=2,横排。
    >> cat(1,student.scores)

    ans =

            50    60
            60    70

    >> cat(2,student.scores)

    ans =

            50    60    60    70

38.计算平均值(使用mean函数)
    计算每次考试的平均值
    >> average1=mean(cat(1,student.scores))

    average1 =

            55    65
    计算每个学生成绩的平均值
    >> average2=mean(student(2).scores)

    average2 =

            65

39.二维曲线绘图的基本操作
(1)plot(x),x为向量时,以该元素的下标为横坐标、元素值为纵坐标绘出曲线。
(2)plot(x,y),x、y为同维数组时,绘制以x、y元素为横纵坐标的曲线。
(3)plot(x1,y1,x2,y2,...),绘制以x1为横坐标、y1为纵坐标的曲线1,以x2为横坐标、y2为纵坐标的曲线2,等等。其中x为横坐标,y为纵坐标,绘
制y=f(x)函数曲线。
    Exam:在[0,2π]区间内,绘制曲线2e^-0.5xsin(2πx)。
    >> x=0:pi/100:2*pi;
    >> y=2*exp(-0.5*x).*sin(2*pi*x);
    >> plot(x,y)
    Exam:绘制曲线x=tcos(3t)、y=t(sint)^2,-π≤t≤π。
    >> t=-pi:pi/100:pi;
    >> x=t.*cos(3*t);
    >> y=t.*sin(t).^2;
    >> plot(x,y)

40.绘制复杂曲线
    Exam:用图形表示连续调制波形及其包络线。
    >> t=(0:pi/100:pi)';%长度为101的时间采样列向量
    >> y1=sin(t)*[1,-1];%包络线函数值,是(101*2)的矩阵
    >> y2=sin(t).*sin(9*t);%长度为101的调制波列向量
    >> t3=pi*(0:9)/9;
    >> y3=sin(t3).*sin(9*t3);
    >> plot(t,y1,'r',t,y2,'b',t3,y3,'bo')
    >> axis([0,pi,-1,1])

41.重绘曲线
    Exam:重绘波形y=sin(t)sin(9t)及其包络线。
    >> plot(t,y1,'r:')
    >> hold on
    >> plot(t,y2,'b')
    >> plot(t3,y3,'bo')
    >> axis([0,pi,-1,1])
    >> hold off

42.利用hold绘制离散信号的波形
    >> t=2*pi*(0:20)/20;
    >> y=cos(t).*exp(-0.4*t);
    >> stem(t,y,'g');
    >> hold on
    >> stairs(t,y,'r');
    >> hold off

43.双纵坐标:plotyy指令
    调用格式:plotyy(x1,y1,x2,y2),x1-y1曲线y轴在左,x2-y2曲线y轴在右
    >> x=0:0.01:20;
    >> y1=200*exp(-0.05*x).*sin(x);
    >> y2=0.8*exp(-0.5*x).*sin(10*x);
    >> plotyy(x,y1,x,y2);

44.多子图
    subplot(m,n,k):使(m*n)幅子图中第k个子图成为当前图;其编号原则:左上方为第1子图,然后向右向下一次排序。
    subplot('position',[left,bottom,width,height]):在指定的位置上开辟子图,并成为当前图;用于手工指定子图位置,指定位置的四元组采
用归一化的标称单位,即认为整个图形窗口绘图区域的高、宽的取值范围都是[0,1],而左下角为(0,0)坐标。
    >> t=(pi*(0:1000)/1000)';
    >> y1=sin(t);
    >> y2=sin(10*t);
    >> y12=sin(t).*sin(10*t);
    >> subplot(2,2,1);
    >> subplot(2,2,1),plot(t,y1);
    >> axis([0,pi,-1,1])
    >> subplot(2,2,2),plot(t,y2);
    >> axis([0,pi,-1,1])
    >> subplot('position',[0.2,0.2,0.2,0.2]),plot(t,y12);

45.绘制图形的辅助操作
    >> t=(0:15)*2*pi/15;
    >> y=sin(t);
    >> subplot(3,2,1),plot(t,y);title('Lins style is default')%默认
    >> subplot(3,2,2),plot(t,y,'o');title('Lins style is o')%圆圈
    >> subplot(3,2,3),plot(t,y,'k:');title('Lins style is k:')%黑虚线
    >> subplot(3,2,4),plot(t,y,'k:*');title('Lins style is k:*')%黑虚线八线符
    >> subplot(3,2,5),plot(t,y,'m-d');title('Lins style is m-d')%品红实线菱形符
    >> subplot(3,2,6),plot(t,y,'r-p');title('Lins style is r-p')%红实线五角星符

46.绘制椭圆,长轴为3.25,短轴为1.15
    >> x=1.15*cos(t);y=3.25*sin(t);%y为长轴,x为短轴
    >> subplot(2,2,1);plot(x,y);
    >> axis off%不显示坐标轴
    >> title('axis off')
    >> subplot(2,2,2);plot(x,y);
    >> axis image;%纵、横坐标等长刻度,坐标框紧贴数据范围
    >> title('axis image')
    >> subplot(2,2,3);plot(x,y);
    >> axis equal;%纵、横坐标等长刻度
    >> subplot(2,2,4);plot(x,y);
    >> axis square;%产生方形坐标系
    >> title('axis square');

47.分格线与grid指令
    grid on(画出分格线);
    grid off(不画分格线),缺省设置;
    >> t=6*pi*(0:100)/100;
    >> y=1-exp(-0.3*t).*cos(0.7*t);
    >> tt=t(find(abs(y-1)>0.05));
    >> ts=max(tt);
    >> plot(t,y,'r-');
    >> grid on;
    >> axis([0,6*pi,0.6,max(y)]);
    >> title('y=1-exp(-\alpha*t)*cos(\omega*t)');
    >> hold on;
    >> plot(ts,0.95,'bo');
    >> hold off;
    >> set(gca,'xtick',[2*pi,4*pi,6*pi],'ytick',[0.95,1,1.05,max(y)]);
    >> grid on;

48.在正弦曲线上标注特殊值
    >> t=(0:100)/100*2*pi;
    >> y=sin(t);
    >> plot(t,y);
    >> text(3*pi/4,sin(3*pi/4),'\fontsize{16}\leftarrowsin(t)=.707');
    >> text(pi,sin(pi),'\fontsize{16}\leftarrowsin(t)=0');
    >> text(5*pi/4,sin(5*pi/4),'\fontsize{16}sin(t)=-.707\rightarrow','HorizontalAlignment','right')
%'HorizontalAlignment','right'设置图形标识为水平右对齐

    >> t=0:900;
    >> plot(t,0.25*exp(-0.005*t));
    >> title('\fontsize{16}\itAe^{\alphat}');
    >> text(300,.25*exp(-0.005*300),'\fontsize{14}\leftarrow0.25\ite^-0.005\itt_at\itt=300');

49.特殊图形(直方图(柱形图)bar)
    >> x=-2.9:0.2:2.9;
    >> bar(x,exp(-x.*x),'r');

例如:北京市从业人员统计

    (累计式直方图一(竖着))
    >> year=[1990 1995 2000];
    >> people=[90.7 281.6 254.8;70.6 271 323.7;73.9 214.6 326.5];
    >> bar(year,people,'stack');
    >> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');

    (累计式直方图二(横着))
    >> barh(year,people,'stack');
    >> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');

    (分组式直方图一(竖着))
    >> bar(year,people,'group');%分组式直方图
    >> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');

    (分组式直方图二(横着))
    >> barh(year,people,'group');
    >> legend('\fontsize{6}第一产业','\fontsize{6}第二产业','\fontsize{6}第三产业');

50.饼图指令pie

饼图指令pie用来表示各元素占总和的百分数。该指令第二输入变量是与第一变量同长的0-1向量,1使对应扇块突出。
    >> a=[1,1.6,1.2,0.8,2.1];
    >> subplot(1,2,1),pie(a,[1 0 1 0 0]),legend({'1','2','3','4','5'});
    >> subplot(1,2,2),b=int8(a==min(a));
    >> pie3(a,b);
    >> colormap(cool);

51.离散杆图stem

例如,余弦波的采样信号图
    >> t=linspace(-2*pi,2*pi,20);
    >> h=stem(t,cos(t));

例如,分别以条形图、填充图、阶梯图和杆图形式绘图
    >> subplot(221);
    >> bar(x,y,'g');
    >> title('bar(x,y,''g'')');
    >> subplot(222);
    >> fill(x,y,'r');
    >> title('fill(x,y,''r'')');
    >> subplot(223);
    >> stairs(x,y,'b');
    >> title('stairs(x,y,''b'')');
    >> subplot(224);
    >> stem(x,y,'k');
    >> title('stem(x,y,''k'')');

52.极坐标图polar

polar函数用来绘制极坐标图,其调用格式为:polar(theta,rho,选项)

例如,绘制ρ=sin(2θ)
    >> theta=0:0.01:2*pi;
    >> rho=sin(2*theta);
    >> polar(theta,rho,'k');

53.三维绘图的基本操作
三维线图指令plot3:三维绘图指令中,plot3最易于理解,它的使用格式与plot十分相似,只是对应第三位空间的参量。
    >> t=(0:0.02:2)*pi;
    >> x=sin(t);
    >> y=cos(t);
    >> z=cos(2*t);
    >> plot3(x,y,z,'b-',x,y,z,'bd');
    >> view([-82,58]);
    >> box on
    >> legend('链','宝石')    

54.三维网线图(mesh)和曲面图(surf)
画函数z=f(x,y)所代表的三维空间曲面,需要做一下的数据准备工作:
    确定自变量的取值范围和取值间隔。
        x=x1:dx:x2;
        y=y1:dy:y2;
    构成x-y平面上的自变量采样“格点”矩阵。
        利用MATLAB指令meshgrid产生“格点”矩阵;
        [xa,ya]=meshgrid(x,y);
    计算函数在自变量采样“格点”上的函数值,即z=f(x,y)。
网线图、曲面图绘制。

例如,绘制函数z=x^2+y^2的曲面
    
    >> x=-4:4;
    >> y=x;
    >> [x,y]=meshgrid(x,y);%生成x-y坐标“格点”矩阵
    >> z=x.^2+y.^2;%计算格点上的函数值
    >> subplot(1,2,1),mesh(x,y,z);%三维网格图
    >> subplot(1,2,2),surf(x,y,z);%三维曲面图
    >> colormap(hot);

55.图像文件的读写与图像显示
    imread指令-读取图像文件(BMP,GIF,PNG,JPEG,andTIFF)
    imshow指令-显示图像
    imwrite指令-保存图像
例如,读取图像文件
    
    >> img1=imread('shenxianyeye.jpg');
    >> img2=imread('cat.tif');
    >> whos img1 img2
      Name        Size                  Bytes  Class    Attributes

      img1      768x1024x3            2359296  uint8              
      img2      598x1005x3            1802970  uint8              

    >> imshow(img1);%显示图片

    简单图像处理
    >> lighter=2*img1;%改变图片的亮度
    >> subplot(1,2,1);
    >> imshow(img1);
    >> title('Original');
    >> subplot(1,2,2);
    >> imshow(lighter);
    >> title('Lighter');
    >> imwrite(lighter,'mysaved.jpg');%保存图像
    >> dir mysaved.*;%查看保存结果

    mysaved.jpg  
    >> black=rgb2gray(img1);%彩色图像转换为灰度图像
    >> imshow(black);
    >> zoom on%图像的缩放

56.图像特征提取
    >> black=rgb2gray(img2);
    >> imag_edge1=edge(black,'sobel');%sobel边缘提取算法
    >> subplot(121),imshow(imag_edge1);
    >> imag_edge2=edge(black,'canny');%canny边缘提取算法
    >> subplot(122),imshow(imag_edge2);
    >> subplot(123),imshow(imag2);


57.MATLAB命令的执行方式
    交互式命令执行方式(命令窗口):逐条输入,逐条执行,操作简单、直观,但速度慢,执行过程不能保留。
    M文件的程序执行方式:将命令编成程序存储在一个文件中(M文件),依次运行文件中的命令,可以重复进行。
    MATLAB程序设计有传统高级语言的特征,又有自己独特的特点,可以利用数据结构的特点,使程序结构简单,编程效率高。

58.M文件的分类
    用MATLAB语言编写的程序,称为M文件。是由若干MATLAB命令组合在一起构成的,它可以完成某些操作,也可以实现某种算法。
    M文件根据调用方式的不同分为两类:命令文件(Script File)、函数文件(Function File)。它们的扩展名都是.m

59.命令文件和函数文件的区别
    命令文件没有输入参数,也不返回输出参数;函数文件可以带输入参数,也可以返回输出参数。
    命令文件对工作空间中的变量进行操作,文件中所有命令的执行结果也返回工作空间中;函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量也被清除。
    命令文件可以直接运行;函数文件不能直接运行,要以函数调用的方式来调用它。


60.顺序结构
    顺序结构是指按照程序中语句的排列顺序依次执行,知道程序的最后一个语句。(最简单的一种程序)
    数据的输入:从键盘输入数据,则可以使用input函数来进行,调用格式为:A=input(提示信息,选项);其中提示信息为一个字符串,用于提示用户输入数据。例如:从键盘输入A矩阵,可以采用下面的命令来完成:A=input('输入A矩阵');
    数据的输出:命令窗口输出函数主要由disp函数,其调用格式为:disp(输出项)其中输出项既可以为字符串,也可以为矩阵。例如:A='Hello,Tom';disp(A)输出为:Hello,Tom。又如:A=[1,2,3;4,5,6;7,8,9];disp(A)
    程序的暂停:程序执行过程中暂停,可用pause函数,其调用格式为:pause(延迟描述);如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。若要强行终止程序的运行可按Ctrl+C键。

61.选择结构
    选择结构是根据给定的条件成立或不成立,分别执行不同的语句。MATLAB用于实现选择结构的语句有if语句,switch语句和try语句。
    if语句:在MATLAB中,if语句有3种格式。
    (1)单分支if语句
    语句格式:
    if条件
        语句组
    end    
    (2)双分支if语句
    语句格式:
    if 条件
        语句组1
    else
        语句组2
    end
    (3)多分支if语句
    语句格式:
    if 条件1
        语句组1
    elseif 条件2
        语句组2
    ...
    elseif 条件m
        语句组m
    else
        语句组n
    end

    switch语句:switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式:
    switch 表达式
    case 表达式1
        语句组1
    case 表达式2
        语句组2
    ...
    case 表达式m
        语句组m
    otherwise
        语句组n
    switch自居后面的表达式应为一个标量或一个字符串;case子句后面的表达式不仅可以为一个标量或一个字符串,还可以为一个元胞矩阵。

    try语句:try语句是一种试探性执行语句,其语句格式为:
    try
        语句组1
    catch
        语句组2
    end
    try语句先试探性执行语句组1,如果在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2。
    例如,矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错则自动转去求两矩阵的点乘。
    clc;
    clear all;
    A=[1,2,3;4,5,6];
    B=[7,8,9;10,11,12];
    try
            C=A*B;
    catch
            C=A.*B;
    end
    C
    lasterr%显示出错原因

62.循环结构
    循环是指按照给定的条件,重复执行指定的语句,MATLAB提供了两种实现循环结构的语句:for语句和while语句。
    
    for语句的格式为:
    for循环变量=表达式1:表达式2:表达式3
        循环体语句
    end
    其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。    

    例如,已知y=1/1^2+1/2^2+...+1/n^2,当n=100时,求y的值。
    clear all;
    clc;
    y=0;
    n=100;
    for i=1:100
            y=y+1/(i*i);
    end
    y

    while语句的一般格式为:
    while条件
        循环体语句
    end
    其执行过程为:
    若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。
    例如,从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和。

    clear all;
    clc;
    sum=0;
    n=0;
    x=input('请输入一个数(end in 0):');
    while(x~=0)
            sum=sum+x;
            n=n+1;
            x=input('请输入一个数(end in 0):');
    end
    if(n>0)
            sum
            mean=sum/n
    end
    
    break语句和continue语句:一般与if语句配合使用。break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。
    例如,求[100,200]之间第一个能被21整除的整数。
    clear all;
    clc;
    for n=100:200
            if rem(n,21)~=0;%判断n是否能被21整除
                continue
            end
            break
    end
    n

63.函数文件
    函数文件是另一种形式的M文件,每一个函数文件都定义一个函数。MATLAB提供的标准函数大部分是由函数文件定义的。
    函数文件的基本结构:函数文件由function语句引导,其基本结构为:
    function 输出形参表=函数名(输入形参表)
      注释说明部分
      函数体语句
    其中,以function开头的一行为引导行,表示该M文件是一个函数文件。当输出形参多余一个时,应该用方括号括起来。

64.说明
    (1)关于函数文件名
    函数文件名通常有函数名再加上扩展名.m组成。
    当函数文件名与函数名不同时,MATLAB将忽略函数名而确认文件名,因此调用时使用函数文件名。
    (2)关于注释说明部分
    注释说明包括3部分:
    ①紧随引导行之后以%开头的第一注释行。
    这一行一般包括大写的函数文件名和函数功能简要描述,供lookfor关键词查询和help在线帮助时使用。
    ②第一注释行及之后连续的注释行。
    通常包括函数输入/输出参数的含义及调用格式说明等信息。    
    ③与在线帮助文本相隔一空行的注释行。
    包括函数文件编写和修改的信息,如作者和版本等。
    (3)关于return语句
    如果在函数文件中插入了return语句,则执行到该语句就结束函数的执行,流程转至调用该函数的位置。通常也不使用return语句。
    例如,编写函数文件,求半径为r的圆的面积和周长。
    function [s,p] = circle(r)
    %CIRCLE calculate the area and perimeter of a circle of radius
    % r     圆半径
    % s     圆面积
    % p    圆周长

    %2020年12月10日编
    s=pi*r*r;
    p=2*pi*r;
    end

65.函数调用
函数调用的一般格式是:[输出实参表]=函数名(输入实参表)
注意:函数调用时,各实参出现的顺序、个数,应与函数定义时相同。
    例如,利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。
    函数文件:tran.m
    function [rho,theta] = tran(x,y)
    rho=sqrt(x*x+y*y);
    theta=atan(y/x);
    end
    调用函数文件的命令文件:
    clear all;
    clc;
    x=input('please input x=');
    y=input('please input y=');
    [rho,the]=tran(x,y);
    rho
    the

66.函数的嵌套调用
在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数。一个函数调用自身称为函数的递归调用。
    例如,利用函数的递归调用,求n!。
    函数文件factor.m:
    function f = factor(n)
    %FACTOR 此处显示有关此函数的摘要
    %   此处显示详细说明
    if n<=1
            f=1;
    else
        f=factor(n-1)*n;%递归调用求(n-1)!
    end
    在命令文件中调用该函数文件,求s=1!+2!+3!+4!+5!。main2.m
    clear all;
    clc;
    s=0;
    for i=1:5
            s=s+factor(i);
    end
    s

67.函数参数的可调性
MATLAB在函数调用上有一个与一般高级语言不同之处:函数所传递参数数目的可调性,即参数的数量可以改变。在调用函数时,MATLAB用两个预定义变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。
    例如,nargin用法示例
    函数文件(examp.m):
    function fout = charray(a,b,c)
    if nargin==1
            fout=a;
    end
    if nargin==2
            fout=a+b;
    end
    if nargin==3
            fout=(a*b*c)/2;
    end
    end

    命令文件(main_examp.m):
    clear all;
    clc;
    x=[1:3];
    y=[1;2;3];
    examp(x)
    examp(x,y')
    examp(x,y,3)
    
68.全局变量与局部变量
MATLAB中,函数文件中的变量是局部变量。
如在若干函数中,都把某一变量定义为全局变量,那么这些函数将共用这个变量。
全局变量的作用域是整个MATLAB的工作空间,所有函数都可以对它进行存取和修改。
全局变量用global命令定义,格式为:
global 变量名
    例如,全局变量应用示例。先建立函数文件wadd.m,该函数将输入的参数加权相加:
    函数文件(wadd.m)
    function f = wadd(x,y)
    global ALPHA BETA
    f=ALPHA*x+BETA*y;
    end
    命令窗口输入:
    >> global ALPHA BETA
    >> ALPHA=1;
    >> BETA=2;
    >> s=wadd(1,2)

69.程序调试
程序调试时程序设计的重要环节,也是程序设计人员必须掌握的重要技能。
MATLAB提供了相应的程序调试功能,即可以通过文本编辑器对程序进行调试,又可以在命令窗口结合具体的命令进行。
(1)程序调试概述
一般来说,应用程序的错误有两类,一类是语法错误,另一类是运行时的错误。
语法错误,给出相应的错误信息,并标出错误在程序中的行号。
MATLAB对程序逻辑错误时无能为力的,不会给出任何提示信息。可以通过调试手段来发现。
采用的方法如下:
①控制单步运行
step:单步运行,不进入函数;
step in:单步运行,进入函数;
step out:停止单步运行;
save and run:存储文件并开始运行。
②断点操作
stop if error/warnings:在程序执行出现错误或警告是,停止程序运行,进入调试状态。

70.Matlab矩阵分析预处理
(1)常见的特殊矩阵有零矩阵、幺矩阵、单位矩阵等,这类特殊矩阵在应用中具有通用性。
①通用的特殊矩阵
常用的产生通用特殊矩阵的函数有:
zeros:产生全0矩阵(零矩阵)。
ones:产生全1矩阵(幺矩阵)。
eye:产生单位矩阵。
rand:产生0~1间均匀分布的随机矩阵。
randn:产生均值为0,方差为1的标准正态分布随机矩阵。
(2)建立随机矩阵
①在区间[20,50]内均匀分布的5阶随机矩阵。
②均值为0.6,方差为0.1的5阶正态分布随机矩阵。
命令如下:
x=20+(50-20)*rand(5)

71.矩阵结构变换
(1)对角阵与三角阵
    只有对角线上的非零元素的矩阵称为对角矩阵,在研究矩阵时,有时候需要将矩阵的对角线上的元素提取出来形成一个列向量,有时也需要用一个向量构造一个对角阵。
①提取矩阵的对角线元素函数:diag
例如:
A=[1,2,3;4,5,6];
D=diag(A)
D=
    1
    5
diag函数还有一种形式:diag(A,k)提取第k条对角线的元素。
例如:
D1=diag(A,1)
D1=
    2
    6
(2)构造对角矩阵
如果V是一个m个元素的向量,diag(V)将产生一个m*m对角矩阵,其主对角线元素即为向量V的元素。
例如:
>> diag([1,2,-1,4])

ans =

     1     0     0     0
     0     2     0     0
     0     0    -1     0
     0     0     0     4

>> diag(1:3,-1)

ans =

     0     0     0     0
     1     0     0     0
     0     2     0     0
     0     0     3     0
例如:
建立一个5*5矩阵A,然后将A的第一行元素乘以1,第二行乘以2,...第五行乘以5。
解:
   用一个对角矩阵左乘一个矩阵时,相当于用对角阵的第一个元素乘以该矩阵的第一行,依次类推。
命令如下:
>> A=ones(5);
>> D=diag(1:5);
>> D*A

ans =

     1     1     1     1     1
     2     2     2     2     2
     3     3     3     3     3
     4     4     4     4     4
     5     5     5     5     5

72.矩阵求逆与线性方程组求解
(1)矩阵的逆
对于一个方阵A,如果存在一个与其同阶的方阵B,使得:A*B=B*A=I(I为单位矩阵)则称B为A的逆矩阵,当然,A也是B的逆矩阵。求方阵A的逆矩阵可调用函数inv(A)。
例如:求方阵A的逆矩阵,且验证。
>> A=[1,-1,1;5,-4,3;2,1,1];
>> B=inv(A);
>> A*B

ans =

    1.0000    0.0000    0.0000
   -0.0000    1.0000    0.0000
   -0.0000    0.0000    1.0000

(2)用矩阵求逆方法求解线性方程组
例如,用求逆矩阵A的方法解线性方程组
x+2y+3z=5
x+4y+9z=-2
x+8y+27z=6

>> A=[1,2,3;1,4,9;1,8,27];
>> b=[5,-2,6]';
>> x=inv(A)*b   %x=A\b

x =

   23.0000
  -14.5000
    3.6667
也可用左除运算符求解。

73.矩阵行列式值
把一个方程看做一个行列式,并按行列式的规则求值,称为行列式的值。在MATLAB中,使用函数det(A)得到。
例如:
>> A=rand(5)

A =

    0.2760    0.4984    0.7513    0.9593    0.8407
    0.6797    0.9597    0.2551    0.5472    0.2543
    0.6551    0.3404    0.5060    0.1386    0.8143
    0.1626    0.5853    0.6991    0.1493    0.2435
    0.1190    0.2238    0.8909    0.2575    0.9293

>> B=det(A)

B =

    0.0538

74.多项式的MATLAB表达
(1)多项式有一个行向量表示,该向量元素是该多项式的系数,且按降幂次序排列。
例如,多项式x^4-12x^3+25x+116由行向量:p=[1 -12 0 25 116]表示。
注意,必须包括具有零函数的项。求解多项式的根:roots指令。

例如,求解多项式x^4-12x^3+25x+116的根
>> p=[1 -12 0 25 116]

p =

     1   -12     0    25   116

>> r=roots(p)

r =

  11.7473 + 0.0000i
   2.7028 + 0.0000i
  -1.2251 + 1.4672i
  -1.2251 - 1.4672i
MATLAB按惯例规定,多项式是行向量,根是列向量。

(2)已知多项式的根,求解多项式,用poly指令。
>> r=roots(p)

r =

  11.7473 + 0.0000i
   2.7028 + 0.0000i
  -1.2251 + 1.4672i
  -1.2251 - 1.4672i

>> pp=poly(r)

pp =

    1.0000  -12.0000   -0.0000   25.0000  116.0000

(3)多项式的乘法(conv指令)
例如,多项式a(x)=x^3+2x^2+3x+4和b(x)=x^3+4x^2+9x+16的乘积。

>> a=[1 2 3 4];b=[1 4 9 16];
>> c=conv(a,b)

c =

     1     6    20    50    75    84    64

两个以上的多项式的乘法需要重复使用conv。

(4)多项式加法
MATLAB没有提供进行假发运算的函数,如果两个多项式向量大小相同,标准的数组加法有效。把多项式a(x)与上面给出的b(x)相加。
>> a=[1 2 3 4];b=[1 4 9 16];
>> d=a+b

d =

     2     6    12    20
当两个多项式阶次不同,低阶的多项式必须用首零填补,使其与高阶多项式有同样的阶次。
考虑上面多项式c和d相加:
>> c=conv(a,b)

c =

     1     6    20    50    75    84    64

>> e=c+[0 0 0 d]

e =

     1     6    20    52    81    96    84

例如,编写一个多项式加法运算的函数文件

明确需求:定义一个函数,需要有两个输入参数(比如:p1、p2),一个输出参数p_out。
p1、p2表示两个待计算的多项式;
p_out表示两个多项式的求和结果。

函数的内部处理
如p1、p2两个参数大小相等,则直接相加:p_out=p1+p2
如p1、p2两个参数大小不等:
    if length(p1)>length (p2)
        p2前面要补0元素,使p1、p2两参数大小相等
    否则
        p1前面要补0元素,使p1、p2两参数大小相等

function p_out = poly_sum(p1,p2)
%计算两个多项式的和
if length(p1)==length(p2)
    p_out=p1+p2;
elseif length(p1)>length(p2)
    p2=[zeros(1,length(p1)-length(p2)),p2];
    p_out=p1+p2;
else
    p1=[zeros(1,length(p2)-length(p1)),p1];
    p_out=p1+p2;
end

>> poly(c,d)

ans =

     1     6    20    52    81    96    84


(5)多项式的除法(deconv)

举例说明:
c(x)=x^6+6x^5+20x^4+50x^3+75x^2+84x+64除以b(x)=x^3+4x^2+9x+16

>> c=[1 6 20 50 75 84 64];
>> b=[1 4 9 16];
>> [q,r]=deconv(c,b)

q =

     1     2     3     4


r =

     0     0     0     0     0     0     0


(6)多项式的导数(polyder)

举例:求b(x)=x^3+4x^2+9x=16的导数。

>> b=[1 4 9 16];
>> d=polyder(b)

d =

     3     8     9

另外两种形式为:
p=polyder(P,Q):求P*Q的导函数
[p,q]=polyder(P,Q):求P/Q的导函数,导数分子存入p,导数分母存入q。

(7)多项式的估值(polyval)

举例:绘制p(x)=x^3+4x^2-7x-10在[-1,3]段上的曲线。
>> x=linspace(-1,3);
>> p=[1 4 -7 -10];
>> v=polyval(p,x);
>> plot(x,v);
>> title('x^{3}+4x^{2}-7x-10');
>> xlabel('x')

75.函数的数值导数
MATLAB中没有直接提供数值导数的函数,只有计算向前差分的函数diff,其调用格式为:
DX=diff(X)计算向量X的向前差分
DX=diff(X,n)计算向量X的n阶向前差分

例如,设x由[0,2n]间均匀分布的10个点组成,求sinx的1-3阶差分。命令如下:
>> X=linspace(0,2*pi,10);
>> Y=sin(X);
>> DY=diff(Y)

DY =

  Columns 1 through 5

    0.6428    0.3420   -0.1188   -0.5240   -0.6840

  Columns 6 through 9

   -0.5240   -0.1188    0.3420    0.6428

>> D2Y=diff(Y,2)

D2Y =

  Columns 1 through 5

   -0.3008   -0.4608   -0.4052   -0.1600    0.1600

  Columns 6 through 8

    0.4052    0.4608    0.3008

>> D3Y=diff(Y,3)

D3Y =

  Columns 1 through 5

   -0.1600    0.0556    0.2452    0.3201    0.2452

  Columns 6 through 7

    0.0556   -0.1600

例如,设f(x)=根号(x^3+2x^2-x+12)+根号^6(x+5)+5x+2,在[-3,3]区间内以0.01为步长求数值导数。并画出导函数图像。程序如下:
>> f=inline('sqrt(x.^3+2*x.^2-x+12)+(x+5).^(1/6)+5*x+2');
>> x=-3:0.01:3;
>> dx=diff(f([x,3.01]))/0.01;
>> plot(x,dx)

76.数值积分
一元函数的数值积分
常用积分指令:quad和quadl。一般说来,quadl比quad更有效。
具体调用格式如下:
q=quadl(fun,a,b)
q=quadl(fun,a,b,tol)
q=quadl(fun,a,b,tol,trace)
[q,fcnt]=quadl(fun,a,b,...)
输入量fun为被积函数的句柄。
输入量a,b分别是积分的下限和上限,都必须是确定的 数值;
前3个输入参数是调用积分指令所必须的,其他可以缺省;
输入量tol是一个标量,控制绝对误差;
输入量trace为非0值时,将随积分的进程逐点画出被积分函数;
输出参数fcnt返回函数的执行次数。
Note:quad的调用格式与quadl相同。

举例:求定积分I=∫(0->1)e^(-x^2)dx
MATLAB指令quad和quadl求积分

>> fun=inline('exp(-x.*x)','x');%数组乘符号.*的采用是必须的
>> Isim=quad(fun,0,1),I8=quadl(fun,0,1)

Isim =

    0.7468


I8 =

    0.7468

举例:求解定积分I=∫(0->1)根号ln(1/x)dx
用quad指令求积分
>> ff=inline('sqrt(log(1./x))','x');
>> Isim=quad(ff,0,1)

Isim =

    0.8862

77.元素排序
MATLAB中对向量X排序的函数是sort(X),函数返回一个对X中的元素按升序排列的新向量。sort函数也可以对矩阵A的各列(或行)重新排序,其调用格式为:
[Y,I]=sort(A,dim)
dim=1,按列排序;dim=2,按行排序,Y是排序后的矩阵,I记录Y中的元素在A中的位置。

例如,对下列矩阵做各种排序。
A=[1,-8,5;4,12,6;13,7,-13]
>> A=[1,-8,5;4,12,6;13,7,-13];
>> sort(A)

ans =

     1    -8   -13
     4     7     5
    13    12     6

>> sort(-A,2)%对A的每行按降序排列

ans =

    -5    -1     8
   -12    -6    -4
   -13    -7    13

78.数据插值
在工程测量和科学实验中,所得到的的数据通常是离散的,要得到这些离散点以外的其他店的数值,就需要根据已知的数据进行插值。插值函数一般由线性函数、多项式、样条函数或这些函数的分段函数充当。
一维数据插值:被插值函数有一个单变量。
才用的方法有:线性方法、最近方法、三次样条和三次插值。在MATLAB中实现这些插值的函数是interp1,其调用格式如下:
Y1=interp1(X,Y,X1,method)
(1)'linear':线性插值。默认的插值方式。它是把插值点靠近的两个数据点用直线连接,然后在直线上选取对应插值点的数据。
(2)'nearest':最近点插值。根据已知插值点与已知数据点的远近程度进行插值。插值点优先选择较近的数据点进行插值。
(3)'pchip':3次多项式插值。根据已知数据求出一个3次多项式,然后根据该多项式进行插值。
(4)'spline':3次样条插值。指在每个分段内构造一个3次多项式,使其满足插值条件外,在个节点处具有光滑的条件。

例:给出概率积分数据表如下,用不同的插值方法计算f(0.472)。
x      0.46        0.47       0.48       0.49
f(x)   0.4846555   0.4937542  0.5027498  0.5116683


>> x=0.46:0.01:0.49;
>> f=[0.4846555,0.4937542,0.5027498,0.5116683];
>> format long
>> interp1(x,f,0.472)

ans =

   0.495553320000000

>> interp1(x,f,0.472,'nearest')

ans =

   0.493754200000000

>> interp1(x,f,0.472,'spline')

ans =

   0.495560736000000
>> interp1(x,f,0.472,'pchip')

ans =

   0.495561119712056

79.曲线拟合
数值插值要求逼近函数在采样点与被逼近函数相等,但由于测量误差,所获得的数据不一定准确,如果强求逼近显然不够合理。曲线拟合不要求逼近函数通过各采样点,但要尽量的接近这些点,是误差在某种意义上达到最小。

曲线拟合的实现:
在MATLAB中,用ployfit函数来求得最小二乘拟合多项式的系数,再用polyval函数按所得的多项式计算所给出点上的函数近似值。
polyfit函数的调用格式为:
[P,S]=polyfit(X,Y,m)

例:用一个三次多项式在区间[0,2n]内逼近函数sinx。
在给定的区间内,均匀的选择20个采样点,并计算采样点的函数值,然后利用3次多项式逼近。

命令如下:
>> x=linspace(0,2*pi,20);
>> y=sin(x);
>> p=polyfit(x,y,3)

p =

  Columns 1 through 2

   0.088357278851222  -0.832747734390553

  Columns 3 through 4

   1.780900319878795  -0.115602892148138

>> y1=polyval(p,x)

y1 =

  Columns 1 through 2

  -0.115602892148138   0.385457422110637

  Columns 3 through 4

   0.723553873446247   0.917858681026122

  Columns 5 through 6

   0.987544064017693   0.951782241588392

  Columns 7 through 8

   0.829745432905651   0.640605857136901

  Columns 9 through 10

   0.403535733449572   0.137707281011097

  Columns 11 through 12

  -0.137707281011096  -0.403535733449570

  Columns 13 through 14

  -0.640605857136898  -0.829745432905648

  Columns 15 through 16

  -0.951782241588388  -0.987544064017687

  Columns 17 through 18

  -0.917858681026114  -0.723553873446236

  Columns 19 through 20

  -0.385457422110625   0.115602892148153

>> plot(x,y,':o',x,y1,'-*')
>> legend('sin(x)','fit')
 


 

  • 66
    点赞
  • 564
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
第1章 BP神经网络的数据分类——语音特征信号分类 第2章 BP神经网络的非线性系统建模——非线性函数拟合 第3章 遗传算法优化BP神经网络——非线性函数拟合 第4章 神经网络遗传算法函数极值寻优——非线性函数极值寻优 第5章 基于BP_Adaboost的强分类器设计——公司财务预警建模 第6章 PID神经元网络解耦控制算法——多变量系统控制 第7章 RBF网络的回归--非线性函数回归的实现 第8章 GRNN网络的预测----基于广义回归神经网络的货运量预测 第9章 离散Hopfield神经网络的联想记忆——数字识别 第10章 离散Hopfield神经网络的分类——高校科研能力评价 第11章 连续Hopfield神经网络的优化——旅行商问题优化计算 第12章 初始SVM分类与回归 第13章 LIBSVM参数实例详解 第14章 基于SVM的数据分类预测——意大利葡萄酒种类识别 第15章 SVM的参数优化——如何更好的提升分类器的性能 第16章 基于SVM的回归预测分析——上证指数开盘指数预测. 第17章 基于SVM的信息粒化时序回归预测——上证指数开盘指数变化趋势和变化空间预测 第18章 基于SVM的图像分割-真彩色图像分割 第19章 基于SVM的手写字体识别 第20章 LIBSVM-FarutoUltimate工具箱及GUI版本介绍与使用 第21章 自组织竞争网络在模式分类中的应用—患者癌症发病预测 第22章 SOM神经网络的数据分类--柴油机故障诊断 第23章 Elman神经网络的数据预测----电力负荷预测模型研究 第24章 概率神经网络的分类预测--基于PNN的变压器故障诊断 第25章 基于MIV的神经网络变量筛选----基于BP神经网络的变量筛选 第26章 LVQ神经网络的分类——乳腺肿瘤诊断 第27章 LVQ神经网络的预测——人脸朝向识别 第28章 决策树分类器的应用研究——乳腺癌诊断 第29章 极限学习机在回归拟合及分类问题中的应用研究——对比实验 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江水质评价 第34章 广义神经网络的聚类算法——网络入侵聚类 第35章 粒子群优化算法的寻优算法——非线性函数极值寻优 第36章 遗传算法优化计算——建模自变量降维 第37章 基于灰色神经网络的预测算法研究——订单需求预测 第38章 基于Kohonen网络的聚类算法——网络入侵聚类 第39章 神经网络GUI的实现——基于GUI的神经网络拟合、模式识别、聚类 第40章 动态神经网络时间序列预测研究——基于MATLAB的NARX实现 第41章 定制神经网络的实现——神经网络的个性化建模与仿真 第42章 并行运算与神经网络——基于CPU/GPU的并行神经网络运算 第43章 神经网络高效编程技巧——基于MATLAB R2012b新版本特性的探讨 第44章 层次分析法 第45章 灰色关联度 第46章 熵权法 第47章 主成分分析 第48章 主成分回归 第49章 偏最小二乘 第50章 逐步回归分析 第51章 模拟退火 第52章 RBF,GRNN,PNN-神经网络 第53章 竞争神经网络与SOM神经网络 第54章 蚁群算法tsp求解 第55章 灰色预测GM1-1 第56章 模糊综合评价 第57章 曲线拟合 目前没空,后面继续整理,还有很多类似的代码,欢迎下载
MATLAB智能算法的源代码%% 清空环境 clc;clear %% 障碍物数据 position = load('barrier.txt'); plot([0,200],[0,200],'.'); hold on B = load('barrier.txt'); xlabel('km','fontsize',12) ylabel('km','fontsize',12) title('二维规划空间','fontsize',12) %% 描述起点和终点 S = [20,180]; T = [160,90]; plot([S(1),T(1)],[S(2),T(2)],'.'); % 图形标注 text(S(1)+2,S(2),'S'); text(T(1)+2,T(2),'T'); %% 描绘障碍物图形 fill(position(1:4,1),position(1:4,2),[0,0,0]); fill(position(5:8,1),position(5:8,2),[0,0,0]); fill(position(9:12,1),position(9:12,2),[0,0,0]); fill(position(13:15,1),position(13:15,2),[0,0,0]); % 下载链路端点数据 L = load('lines.txt'); %% 描绘线及中点 v = zeros(size(L)); for i=1:20 plot([position(L(i,1),1),position(L(i,2),1)],[position(L(i,1),2)... ,position(L(i,2),2)],'color','black','LineStyle','--'); v(i,:) = (position(L(i,1),:)+position(L(i,2),:))/2; plot(v(i,1),v(i,2),'*'); text(v(i,1)+2,v(i,2),strcat('v',num2str(i))); end %% 描绘可行路径 sign = load('matrix.txt'); [n,m]=size(sign); for i=1:n if i == 1 for k=1:m-1 if sign(i,k) == 1 plot([S(1),v(k-1,1)],[S(2),v(k-1,2)],'color',... 'black','Linewidth',2,'LineStyle','-'); end end continue; end for j=2:i if i == m if sign(i,j) == 1 plot([T(1),v(j-1,1)],[T(2),v(j-1,2)],'color',... 'black','Linewidth',2,'LineStyle','-'); end else if sign(i,j) == 1 plot([v(i-1,1),v(j-1,1)],[v(i-1,2),v(j-1,2)],... 'color','black','Linewidth',2,'LineStyle','-'); end end end end path = DijkstraPlan(position,sign); j = path(22); plot([T(1),v(j-1,1)],[T(2),v(j-1,2)],'color','yellow','LineWidth',3,'LineStyle','-.'); i = path(22); j = path(i); count = 0; while true plot([v(i-1,1),v(j-1,1)],[v(i-1,2),v(j-1,2)],'color','yellow','LineWidth',3,'LineStyle','-.'); count = count + 1; i = j; j = path(i); if i == 1 || j==1 break; end end plot([S(1),v(i-1,1)],[S(2),v(i-1,2)],'color','yellow','LineWidth',3,'LineStyle','-.'); count = count+3; pathtemp(count) = 22; j = 22; for i=2:count pathtemp(count-i+1) = path(j); j = path(j); end path = pathtemp; path = [1 9 8 7 13 14 12 22]; %% 蚁群算法参数初始化 pathCount = length(path)-2; %经过线段数量 pheCacuPara=2; %信息素计算参数 pheThres = 0.8; %信息素选择阈值 pheUpPara=[0.1 0.0003]; %信息素更新参数 qfz= zeros(pathCount,10); %启发值 phePara = ones(pathCount,10)*pheUpPara(2); %信息素 qfzPara1 = ones(10,1)*0.5; %启发信息参数 qfzPara2 = 1.1; %启发信息参数 m=10; %种群数量 NC=500; %循环次数 pathk = zeros(pathCount,m); %搜索结果记录 shortestpath = zeros(1,NC); %进化过程记录 %% 初始最短路径 dijpathlen = 0; vv = zeros(22,2); vv(1,:) = S; vv(22,:) = T; vv(2:21,:) = v; for i=1:pathCount-1 dijpathlen = dijpathlen + sqrt((vv(path(i),1)-vv(path(i+1),1))^2+(vv(path(i),2)-vv(path(i+1),2))^2); end LL = dijpathlen; %% 经过的链接线 lines = zeros(pathCount,4); for i = 1:pathCount lines(i,1:2) = B(L(path(i+1)-1,1),:); lines(i,3:4) = B(L(path(i+1)-1,2),:); end %% 循环搜索 for num = 1:NC %% 蚂蚁迭代寻优一次 for i=1:pathCount for k=1:m q = rand(); qfz(i,:) = (qfzPara2-abs((1:10)'/10-qfzPara1))/qfzPara2; %启发信息 if q<=pheThres%选择信息素最大值 arg = phePara(i,:).*(qfz(i,:).^pheCacuPara); j = find(arg == max(arg)); pathk(i,k) = j(1); else % 轮盘赌选择 arg = phePara(i,:).*(qfz(i,:).^pheCacuPara); sumarg = sum(arg); qq = (q-pheThres)/(1-pheThres); qtemp = 0; j = 1; while qtemp < qq qtemp = qtemp + (phePara(i,j)*(qfz(i,j)^pheCacuPara))/sumarg; j=j+1; end j=j-1; pathk(i,k) = j(1); end % 信息素更新 phePara(i,j) = (1-pheUpPara(1))*phePara(i,j)+pheUpPara(1)*pheUpPara(2); end end %% 计算路径长度 len = zeros(1,k); for k=1:m Pstart = S; Pend = lines(1,1:2) + (lines(1,3:4)-lines(1,1:2))*pathk(1,k)/10; for l=1:pathCount len(1,k) = len(1,k)+sqrt(sum((Pend-Pstart).^2)); Pstart = Pend; if l<pathCount Pend = lines(l+1,1:2) + (lines(l+1,3:4)-lines(l+1,1:2))*pathk(l+1,k)/10; end end Pend = T; len(1,k) = len(1,k)+sqrt(sum((Pend-Pstart).^2)); end %% 更新信息素 % 寻找最短路径 minlen = min(len); minlen = minlen(1); minant = find(len == minlen); minant = minant(1); % 更新全局最短路径 if minlen < LL LL = minlen; end % 更新信息素 for i=1:pathCount phePara(i,pathk(i,minant)) = (1-pheUpPara(1))* phePara(i,pathk(i,minant))+pheUpPara(1)*(1/minlen); end shortestpath(num) = minlen; end figure; plot(1:NC,shortestpath,'color','blue'); hold on % plot(1:NC,dijpathlen,'color','red'); ylabel('路径总长度'); xlabel('迭代次数');
MATLAB中,有一些常用代码可以帮助你进行数据处理、图形绘制、矩阵运算等任务。 1. 创建向量或矩阵:可以使用方括号和分号来创建向量和矩阵。例如,a = [1 2 3]创建了一个包含1、2和3的行向量,b = [1; 2; 3]创建了一个包含1、2和3的列向量,c = [1 2; 3 4]创建了一个2x2的矩阵。 2. 加载和保存数据:可以使用load和save函数加载和保存数据。load函数可以从文件中加载数据到变量中,save函数可以将变量保存到文件中。 3. 绘制图形:可以使用plot函数绘制二维曲线图,使用scatter函数绘制散点图,使用bar函数绘制柱状图,使用imshow函数显示图像等等。 4. 矩阵运算:MATLAB提供了许多用于矩阵运算的函数,例如,可以使用transpose函数对矩阵进行转置,使用inv函数计算矩阵的逆,使用det函数计算矩阵的行列式,使用eig函数计算矩阵的特征值和特征向量等等。 5. 控制流程:MATLAB提供了if语句、for循环和while循环等控制流程的功能。可以使用这些关键词来实现不同的条件判断和循环操作。 6. 函数定义:可以使用function关键词来定义自己的函数。函数文件以.m为扩展名,可以接受输入参数并返回输出结果。 综上所述,以上是一些MATLAB常用代码片段。你可以根据具体的应用场景选择适当的代码来完成你的任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [学习和工程中常用matlab代码](https://blog.csdn.net/pgl512228/article/details/107761703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [MATLAB常用代码完结)](https://blog.csdn.net/YYSTINTERNET/article/details/110424613)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caoyy686868

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值