美文网首页
Matlab语法随笔(暂停更新)

Matlab语法随笔(暂停更新)

作者: 小陈学coding | 来源:发表于2018-08-19 21:51 被阅读0次

    本文档中大多数内容都可以通过type(显示文件内容)和help(显示函数帮助)来理解
    下面部分的功能和函数说明适用于深度学习方面的知识。

    基础

    1、基本符号:

    clc清空历史窗口中的内容,但是变量值不会变
    clear变量全部清空
    不等于符号:~=
    异或运算符:xor(a,b) 例:xor(1,0)ans=1
    其他符号参考c++,基本一致。
    输入PS1('>> ');回车:前面提示符变成>>
    disp(a)显示变量值
    disp(sprintf('2 decimals :%0.2f',a))输出,并且冒号后跟上a的值,a保留两位小数。写法和c差不多。
    disp(['the value of a:',a])字符串后跟上变量
    exit quit可以退出主程序。
    close可以关闭绘图窗口
    addpath('c:\Desktop')将路径添加到窗口中。这样即便你到了其他路径也能使用该路径下的文件和方法。
    addpath(genpath('C:\ProgramSoftware\MatLab\DeepLearnToolbox-master'))将根路径为'C:\ProgramSoftware\MatLab\DeepLearnToolbox-master'目录下的所有子文件夹都加入到路径下
    ...(英文格式下输入。) 续行符,代码比较长一行写不下可以使用续行符进行续行。但是使用续行符时前面要加上空格,不然无效。
    assert(er < 0.10, 'Too big error');assert函数,如果er>=0.10就输出错误信息。

    2、基本类型

    %matlab中默认的数值类型为双精度浮点型,一般通过整型函数将浮点型数据转换成整型数据。
    %不同的整形数据所占的内存是不同的。
    int8() int16() int32() int64()    %存储字节数(1 2 4 8)不同,正向正无穷大取整,负向负无穷大取整
    uint8() uint16() uint32() uint64()   %存储字节数(1 2 4 8)不同,向0取整
    

    3、矩阵写法

    >>A = [1 2; 3 4; 5 6]
    A=
          1     2
          3     4
          5     6
    >>A=[1 2;
    >3 4;
    >5 6]
    A=
          1     2
          3     4
          5     6
    %以上>符号都是控制台自带前缀,不用手打
    >>A(3,2)   %访问矩阵A的第三行第二列
    ans=
          6
    >>A(3,:)   %冒号表示所有元素,即提取A矩阵第三行的所有元素
    >>A([1 3],:)   %获取1、3行的所有元素
    >>A=[A,[1;3;4]]   %右侧加上新的一列
    >>A(:)  %将A中的所有元素加入到一个列向量里
    >>C=[A B]      %在右侧连接(此写法同C=[A,B])
    >>C=[A ;B]     %在下方连接
    >>v=1:0.1:2      %步长为0.1,包含1和2的1x11矩阵,这里为了篇幅不过长不显示出来结果。
    >>v=1:6          %从1到6包含1和6的6个整数的矩阵。
    >>ones(2,3)
    ans=
            1      1      1
            1      1      1
    %同理还有zeros(a,b)函数生成全为0的矩阵、rand(a,b)生成全为0~1之间随机数的矩阵、
    %randn(a,b)生成服从高斯分布(均值为0,标准差或方差为1)的随机数矩阵,等等,生成随机数下面会提到。
    >>eye(4)    %生成单位矩阵
    ans = 
    Diagonal  Matrix  
          1     0     0     0
          1     1     0     0
          1     0     1     0
          1     0     0     1
    >>size(A)   %显示矩阵A的大小
    ans=        %ans是一个1x2的矩阵
          3      2
    >>size(A,1)  %返回A矩阵第一维度大小
    ans=
          3
    >>length(A) %返回矩阵A较长维度。如果是向量就返回向量长度
    ans=
          3
    hist(w)     %将w绘制成一个直方图
    hist(w,50)  %将w绘制成一个有50个竖条的直方图
    >>q([i2 i1])   %输出q向量下标为i2和i1的变量。
    >>qnew([i1 i2])=q([i2 i1])    %向量i1下标和i2下标变量位置互换
    

    4、访问文件数据

    大部分命令和linux环境下的命令很像。具体如下:

    >>pwd        %查看当前路径
    >>cd 'C:\Users\administrator\Desktop'   %跳到某路径下
    >>ls         %查看当前路径下的文件
    >>load a.dat     %加载当前目录下的a.dat文件数据
    >>load('a.dat')  %效果同上
    >>who            %查看当前内存中存储的变量
    >>whos           %显示当前内存中变量,并且显示大小、数据类型等详细数据
    >>clear x        %从内存中删除x变量
    >>v=x(1:10)      %x变量内的前10个元素赋值给v
    >>save hello.mat v   %将变量v存储到hello.dat文件内
    >>save hello.txt v -ascii %存储为ASCII编码格式的txt文件
    

    5、生成随机数

    rand(1)   %随机生成0~1之间的一个随机数字
    rand(m,n)    %生成m行n列均匀分布的伪随机数,分布在(0,1)之间
    rand(m,n,'double')   %生成指定精度的伪随机数参数还可以是single
    rand('state',0)   %保持每次随机都是同样的状态(用于读者运行能获得和笔者一样的效果)
    
    randn   %生成标准正态分布的伪随机数均值0方差1,语法和上一样
    
    randi   %生成均匀分布的伪随机整数
    randi(a)    %在开区间(0,a)生成均匀分布的整数伪随机整数
    randi(a,m,n)    %在开区间(0,a)之间生成mxn矩阵
    randi([a,b],m,n)  %在开区间(a,b)生成mxn矩阵
    
    unidrnd(n)    %产生一组从1~n的离散均匀随机整数
    %其中n可以是一个向量、矩阵、[多维数组](当然也可以是一个数,即1乘以1的矩阵),但n中所有元素都必须是正整数。(0不行,会NaN)
    %这种调用方式将产生一个和n具有相同尺寸(行、列、维数)的矩阵
    R = unidrnd(N,v)
    %这种调用格式中v是一个行向量,如果v是一个1乘以2的向量, 则v中的两个元素分别指定了生成的矩阵R的行数(由v(1)指定)和列数(由v(2)指定)。如果v是一个1乘以n的矩阵, 则R是一个n维数组。
    R = unidrnd(N,m,n)
    %这里m和n分别指定生成的矩阵R的行数和列数。
    

    randperm:

    >>p=randperm(n)   %返回一行从1~n的整数。行向量。
    >>p = randperm(n,k)   %从1-n的数字序列里面随机返回k个数(k个数互相之间不一样)
    >>new = old( randperm( size(old,1) ) , : )    %数组中各行被重排列的例子
    

    randsample:

    >>y = randsample(n,k)   %产生k个1~n的数(列向量)
    >>y = randsample(population,k)  %从数组里随机取出k个不相同的数
    >> y = randsample(n,k,replacement) %replacement是一个bool函数1可能重复,0可能不重复
    >> y = randsample(population,k,replacement)
    >> y = randsample(n,k,true,w)
    >> y = randsample(population,k,true,w)
    >> y = randsample(s,...)
    

    6、关键字

    format
    format short   %默认格式,小数点后保留4位
    format long     %有效数字16位
    format long e   %有效数字16位加3位指数
    format short e  %有效数字5位加3位指数
    format bank      %保留两位小数位
    format +            %只给出正负
    format rational  %以分数的形式表示
    format hex        %以16进制数表示
    format long g    %15位有效数
    format short g   %5位有效数
    format compact   %去掉命令行中的多余的空行
    format loose        %恢复上一步操作之前的状态
    

    具体可以参考https://jingyan.baidu.com/article/3f16e003e7486b2590c10372.html

    7、数据导入

    >>a=rand(5,10)
    >>xlswrite('data5.xls',a,'Sheet1','B2')
    %把矩阵a写到excel文件data5.xls文件中的表单Sheet1 B2列开始的域中
    
    >>b=xlsread('data5.xls','Sheet2','C3:F6')
    %把Exp1中生成的Excel文件data5.xls中表单Sheet1的域“C3:F6”中的数据赋给b
    
    >>load test
    %加载test.mat文件中的内容到test变量内。
    

    8、字符串连接

    >>SC=[str1,str2]    %方法1
    >>strcat(str,str1)    %方法2
    >>strcat({‘Red’,’Yellow’},{‘Green’,’Blue’})
    ans =
      ‘RedGreen’ ‘YellowBlue’
    >>strcat([‘Red’,’Yellow’],[‘Green’,’Blue’])
    ans =
      RedYellowGreenBlue
    >>STR=sprintf(‘%s%d’,str1,number)    %方法3
    

    9、字符串截取

    >>i1=strfind(temp,',')   %从temp字符串中获得值为','的下标,赋值给i1
    %这里注意 ,如果temp中有多个',',i1将会是一个下标向量。
    >>i2=temp(1:6)           %将temp字符串中的下标为1~6之间的值取出来给i2
    

    函数

    1、repmat函数

    基本语法:
    B = repmat(A,m,n)
    B = repmat(A,[m n])
    B = repmat(A,[m n p...])
    

    处理内容有重复的大矩阵的时候使用这个函数。比如:如果A矩阵是一个1x2x3的矩阵,那么B=repmat(A,2,3)后的矩阵B就是2x6x3
    同时重复的也不仅仅是矩阵,也能是字符串,甚至是NaN:
    下例程来源于https://blog.csdn.net/anqier1009/article/details/5214978

    B=repmat([1 2;3 4],2,3)
    B=
    1   2   1   2   1   2
    3   4   3   4   3   4
    1   2   1   2   1   2
    3   4   3   4   3   4
    其结果变为4x6.A也可以放置文字串,如:
    C=repmat('Long live the king!',2,2)
    C=
    Long live the king!   Long live the king!
    Long live the king!   Long live the king!
    也可以放置其他的:
    >>D=repmat(NaN,2,5)
    D=
    NaN   NaN   NaN   NaN   NaN
    NaN   NaN   NaN   NaN   NaN
    

    2、sum函数和prod函数

    顾名思义,求和函数,但是在matlab中已经有+号了,为什么还要sum函数呢?这是用来计算矩阵的。例如:(简书不支持自定义颜色之类的,下面的%号后的颜色并没有变化,但是//实在是太难看了,这里还是改成了%。值得一提的是:matlab中多行注释可以选中需要注释的字段,然后按下ctrl+R,就可以快速注释。取消注释是ctrl+T)

    >>x=[1 2 3;4 5 6;7 8 9]
    x=
              1     2      3
              4     5      6
              7     8      9
    >>sum(x)        %列求和,等价于sum(x,1),即从第一维度去看
    ans=
             12     15     18
    >>sum(x,2)     %行求和
    ans=
              6
              15
              24
    >>sum(x(:))    %矩阵求和
    ans=
              45
    
    
    >>prod(A)   %求得矩阵A内所有元素的乘积
    

    3、round函数

    round(A)   %返回A的四舍五入取整。A可以是一个数也可以是数组或者矩阵
    

    4、svd函数

    此函数用于奇异值求解。具体可以看官方文档:https://ww2.mathworks.cn/help/matlab/ref/svd.html这里不多作赘述。

    5、矩阵计算

    .* 和 * 的区别是什么:

    在两个数值相乘中,不存在任何区别。只是有些时候需要在提示莫名错误的时候加上一个点。但是在矩阵相乘中,.*表示矩阵中对应位置的数字相乘,结果放在这个位置,然后形成一个新的矩阵。但是*表示的确实实实在在的矩阵相乘。需要进行相应行列乘积操作。同样的,.*在数组中也是代表对应位置相乘。两个数组*起来会报错,但是两个数组.*就是一个新的数组。
    同理,A.^2表示的就是A矩阵中每个元素都分别平方。

    >>log(A)    %矩阵A每个元素分别进行log计算
    >>exp(A)    %矩阵A每个元素进行以e为底,A中元素为指数的幂运算
    >>abs(A)    %计算每个元素分别的绝对值
    >>-A        %  -1*A
    %max function example
    >>A=[1 2 5 0]
    >>val=max(A)
    val=5
    >>[val,ind]=max(A)
    val=5
    ind=3
    %如果A是一个矩阵:
    max(A)会得到每一列的最大值。
    >>max(A,[],1)  %返回每一列的最大值,1表示从A矩阵的第一维度去取(max函数默认形式)
    >>max(A,[],2)  %返回每一行的最大值,2也表示从A矩阵第二维度去取
    %max function example
    >>A<3      %这里的A是上面的A
    A=
            1     1     0     1
    >>find(A<3)    %这里的A是上面定义的A返回A中小于3的元素的索引
    
    数组右除法:

    A./B,A 和 B 的元素逐个对应相除:A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量。

    数组左除法:

    A.\B,A 和 B 的元素逐个对应相除:B(i,j)/A(i,j)两数组之间必须有相同的形,或其中一个是标量。

    矩阵右除法:

    A/B 矩阵除法,等价于 A*inv(B), inv(B)是 B 的逆阵。

    矩阵左除法:

    A\B 矩阵除法,等价于 inv(B)*A, inv(A)是 A 的逆阵。

    这里需要注意:matlab中矩阵求逆有两个函数,一个是pinv,一个是inv,这两个技术实现上有很大的区别。数学上能证明,pinv能够计算出矩阵的逆,即便这是一个不可逆的矩阵, 仍然能返回一个值。

    数组指数运算:

    A.^B,AB中的元素逐个进行如下运算:A(i,j)^B(i,j),A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量。
    顺带一提,如果x是一个矩阵,那么x'指的是x矩阵的转置。

    6、magic函数

    >>A=magic(3)        %返回一个三阶幻方
    A=
          8     1     6
          3     5     7
          4     9     2
    >>[r,c]=find(A>=7)
    r=
        1
        3
        2
    c=
        1
        2
        3
    

    7、一些简单函数

    >>floor(A)     %A中所有元素向下取整
    >>ceil(A)      %A中所有元素向上取整
    

    8、flipud函数

    flipud(A)    %使矩阵A进行垂直翻转
    

    9、matlab程序运行时间计算

        写论文作对比试验免不了需要检测程序运行时间。这个时候就需要用到matlab的这一功能了。matlab中时间计算有三种方法:

    方法一:
    tic and toc
    example:
    >>tic               %开始计算时间
    >>disp(num2str(toc))     %输出与上一个tic间隔时间
    方法二:
    etime配合clock
    >>t1=clock
    >>t2=clock
    >>etime(t2,t1)       %间隔时间输出
    方法三:
    cuptime
    >>t1=cputime
    >>t2=cputime-t1
    

    Matlab官方推荐的是使用tic and toc。

    10、图像绘制

    plot(x,y)      %以x为x轴,y为y轴绘制二维图像
    hold on       %在原图像基础上再添加接下来画的图像。
    plot(x,y,'r')    %画出红色线。这里使用颜色首字母表示颜色。
    xlabel('time')      %x轴标签名
    ylabel('value')     %y轴标签名
    title('this is title')    %标示出图表题目
    legend('x function','y function')    %将x、y对应颜色线标示出来。
    print -dpng 'myPlot.png'     %将图片保存为png格式在当前目录下。
    figure(1)     %表示开始绘制第一张图。如果使用不同的数字标示,则表示开始画第二张图
    subplot(1,2,1)    %将绘制图像的面板划分成1x2,然后使用第一个格子。
                      %后面再使用plot则会画在格子里。
    axis([0.5 1 -1 1])   %设置x轴范围为0.5~1,y轴范围为-1~1
    clf    %清除图像
    A=magic(5)
    imagesc(A)    %画出5x5的彩色格子,不同颜色对应不同值。
    imagesc(A),colorbar,colormap gray;   %colorbar:加入颜色条,colormap gray:灰度图
    %使用逗号可以隔开连续执行的操作命令。
    

    11、循环

    %for循环
    %v是一个向量,使用i作为下标进行访问。下面写了两个最简单的for循环
    >>for i=1:10,
    >  v(i)=1;
    >end;
    
    >>indices=1:10;
    >>for i=indices,
    >  disp(i);
    >end;
    %while循环
    >>while i<=5,
    >  v(i)=100;
    >  i=i+1;
    >end;
    %break 的写法,continue同。举个例子,其实除了语法和c++差不多
    >>i=1;
    >>while true,
    >  i=i+1;
    >  if i==6,
    >    break;
    >  end;
    >end; 
    %ifelse
    >>if a==1
    >>  disp('1');
    >>elseif a==2
    >>  disp('2');
    >>else
    >>  disp('3');
    >>end;
    
    %并行for循环
    >>parfor i=1:3,              %输出顺序不按照1~3
    >    disp(i)
    >    c(:,i) = eig(rand(1000)); 
    >end
    

    12、自定义函数

    function [y1,y2]=myFunction(x)   %返回两个参数,x是形参。
      y1=x*2;
      y2=x*3;
    
    >>[a,b]=myFunction(1)    %调用函数
    

    13、find函数

    b=find(a)    %查询a中非零元素的位置。如果a是行向量就返回一个行向量
                 %否则,就返回一个列向量
    b=find(a,2)   %找出a中最先出现的两个不为零的数
    b=find(a,2,'last')   %参数还可以是'first',此命令意为从最后一个非零元素起
    [a1,a2]=find(a)   %找出a矩阵中非零元素所在的行和列,分别存储在列向量a1,a2里
    [a1,a2,v]=find(a)    %找出a矩阵中非零元素所在的行,列,值,分别放在a1,a2,v中
    如果不存在:则会返回'Empty matrix:0-by-1'
    

    14、numel函数

    n = numel(A);
    
    n= numel(A,条件);
    
    %返回数组A中元素个数。若是一幅图像,则numel(A)将给出它的像素数。
    

    15、元胞数组

    ①cell数组的创建

    a={'winter',123,'coming','哈哈'};  %直接赋值
    
    a=cell(1,4);a={'winter',123,'coming','哈哈'};  %通过cell函数预分配内存,再赋值
    

    ②cell数组的访问

    >>a(1)            %访问cell单元
    ans = 
         'winter'
    >>a{1}            %访问cell单元储存的值
    ans=
          winter
    

    ③cell数组删除

    a{1}=[];%并不能删除第一个cell单元,只是变成空值
    a(1)=[];%删除第一个单元
    a(:)=[];%一次性删除所有cell单元
    

    16、特殊符号

    CostFunction=@(q) MyCost(q,model);%以后用到这个函数只需要传入一个q参数
    %并且一直使用model变量。
    %调用例子如下
    [x.Cost, x.Sol]=CostFunction(x.Position);   %只传入一个x.Position参数
    

    17、kron函数

    计算矩阵的Kronecker

    C=kron(A,B)  %矩阵A中的每个元素都乘以矩阵B,示例如下
    >>x=[1 2;3 4]
    x =
         1 2
         3 4
    >> y=[1 0;0 1]
    y =
         1 0
         0 1
    >> kron(x,y)
    ans =
         1 0 2 0
         0 1 0 2
         3 0 4 0
         0 3 0 4
    

    QLib包使用

    1、param_dm_2x_rand函数

    param_dm_2x_rand([2 3]);     %随机生成2*3行和列的矩阵,即6*6的方形矩阵。
    

    神经网络和仿真

    1、归一化

    mapinmax函数
    >>X=[2,3,4,5,6;7,8,9,10,11]
    >>[Y,PS]=mapminmax(X,0,1)   %规定ymax=1 ymin=0的归一化默认ymax=1 ymin=-1
    %这里需要注意的是,mapminmax归一化的是转置的矩阵。
    >>PS
    PS = 
             name: 'mapminmax'
            xrows: 2
             xmax: [2x1 double]
             xmin: [2x1 double]
           xrange: [2x1 double]
            yrows: 2
             ymax: 1
             ymin: 0
           yrange: 1
             gain: [2x1 double]
          xoffset: [2x1 double]
        no_change: 0
    % 其中y=(ymax-ymin)*(x-xmin)/(xmax-xmin)+ymin
    %(这里的x是X矩阵中的一项,y是Y矩阵中对应X矩阵对应位置的项)
    >>A2= mapminmax('reverse',A1,PS)   %反归一化
    >>temp= mapminmax('apply',260,PS)  %某一个值按照PS进行单独的归一化
    
    premnmx函数
    [pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)%是对P和T分别按照行进行归一化处理
    %其中P T分别为原始的输入和输出数据
    %pn:p的归一化结果,minp:  p的每行的最小值,maxp: p的每行的最大值
    %tn:  t矩阵的归一化结果,mint:  t矩阵的最小值,maxt:  t矩阵的最大值
    %下面举个例子便于理解
    >>[pn,minp,maxp,tn,mint,maxt]=premnmx([2,4,3,5;4,2,1,6],[5,2,3,8])
    pn =
    
       -1.0000   0.3333   -0.3333    1.0000
    
        0.2000  -0.6000   -1.0000    1.0000
    
    minp =
    
         2
    
         1
    
    maxp =
    
         5
    
         6
    
    t为1行4列的数据,对其归一化结果为 tn:
    
    tn =0   -1.0000  -0.6667    1.0000
    
    mint =2
    
    maxt=8
    

    相对应的,反归一化就是postmnmx函数。

    2、newcf(新版本中的cascadeforwardnet)

    创建一个级联的前向神经网络

    
    

    3、newff

    %本例是基于matlab 2016a
    >>net2 = newff(P, T, [5 3]);   %不用进行归一化,隐藏层有两层,神经元数分别为5、3
    

    最后,由于各方面原因,包括matlab对于某些数据类型支持不够、某些库函数无法调用的原因,笔者改回了python继续进行研究,暂停更新博文。人生苦短,我选python。

    相关文章

      网友评论

          本文标题:Matlab语法随笔(暂停更新)

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