MATLAB基础指令用法记录

  由于课程实验需要学习使用了MATLAB,在此记录一下MATLAB的基本操作和命令,供参考与查阅。

  学习过程中的资料也链接如下:

  MATLAB矩阵运算:https://wenku.baidu.com/view/82b2d36fb84ae45c3b358ca0.html

  MATLAB常用命令:https://wenku.baidu.com/view/a08c425f001ca300a6c30c22590102020740f2a7.html

 

基础操作命令

 help 命令名  //查询命令/函数的用法
  clc       //清除命令行窗口
  clf      //清除图像
  clear (all)  //清除内存变量和函数
  who(s)    //列出内存变量 s 的信息
  dir      //显示当前目录下的文件
  cd path   //切换至path指定的目录
  save(filename,vars...)  //将 vars 指定的变量存放在 filename.mat 文件中
  load(filename,vars...)  //将指定的变量加载至内存中
  get( var ) //返回句柄 var 对应的结构体的信息

 

   tips:

  (1)通过 cd 命令转换至需要执行操作的目录,从而可以直接键入文件名而不是完整路径来处理文件。也可通过图形界面进行转换;

  (2)MATLAB命令的尾部添加 ';',则命令执行过后不会在命令窗口显示的输出命令执行的结果(并不像一般的程序语言将 ; 作为语句结束的标志);

  (3)通过 clc 清空命令行窗口,使用 clear 来清除某个变量;

  (4) MATLAB 显示某些结构体时,只会给出其句柄,如 fopen 只返回一个数字,而不是具体的句柄的可见信息结构体,可以通过 get( handle ) 命令获得 handle 所对应的句柄的结构体的信息。 

 

元素类型

  MATLAB中的元素类型包括整型、浮点型、字符型、逻辑型和函数句柄等常用类型。

  整型:包括有符号类型和无符号类型。有符号类型包括 int8、int16、int32、int64。无符号类型包括 uint8、uint16、uint32、uint64。上述类型后面数字代表该类型占用的bit数,占用的 bit 数越多,则能表示的范围越大;

  浮点型:包括单精度浮点型 single 和双精度浮点型 double;

  字符型:MATLAB中的字符和字符串均使用 ‘ ’ 进行标注,每个元素占用两个字节;

  函数句柄:一般的定义方式为 function_handle = @function_name ,则创建一个函数句柄,句柄可以视为函数的别名,如 func = @sin,则 sin(x) 也可通过 func( x )实现;

  tips:

  (1)对于变量的类型,可以通过命令 who 或 whos 查看其类型;

  (2)可以通过 类型名(变量名) 的方式对变量/标量类型进行类型转换,如 int8( n )将变量 n 转换为类型 int8;

  (3)只有同类型的数据或其他类型与双精度标量之间可以进行运算; 

 

矩阵基础及操作

  MATLAB中数据元素均以矩阵形式存在,如常量可视为 1×1规格的矩阵,n维向量可以视为 1×n的矩阵。故而其中的运算操作与矩阵运算的性质一致。

  同样,MATLAB中的变量均可以视为矩阵类型,但矩阵的元素有各自的类型。如下A = [ 1 2 3] ,A为矩阵类型变量,而其中的元素为int8类型。

  MATLAB中的变量不需要先定义即可使用,若没有指明被赋值的变量,如上述的A,则矩阵被赋值给默认的变量ans。   

 

矩阵运算

  默认情况下算数运算 + 、 - 、 *、/ 遵循矩阵运算的规则。可以使用点乘( .* )与点除( ./ )运算,运算规则为对应位置上元素进行乘法操作,而不是常规的矩阵乘/除。

  如对于矩阵 A = { 1 2 ; 3  4 },和B = { 1 2 ; 3 4 },A*B = { 7 10 ; 15 22 },而 A .* B = { 1 4 ; 9 16 }。

 

矩阵特征

  (1)矩阵元素在 " [ " 和 " ] "之间;

  (2)同行元素之间使用空格或 " , " 隔开,不同行元素之间使用回车符或 " ; " 隔开; 

  (3)MATLAB中矩阵元素以列优先的顺序进行访问和存储;

 

建立矩阵

  (1)直接输入

  根据上述矩阵特征直接从键盘输入矩阵,如 A = [ 1 2 3 ; 4 5 6 ; 7 8 9] 建立了一个 3×3 的矩阵A。

  利用冒号表达式 a:b:c 建立一个行向量,其中a为初始值,b为递加量,c为终结值(或不需b,默认以1递增)。如 A = 1:1:3 与 A = 1:3均建立一个矩阵A = [1 2 3]

  使用 linespace 函数,用法为 linespace(a,b,c),其作用与冒号表达式相同。

  (2)利用MATLAB提供的函数,以下函数均返回一个矩阵,可以指定一个变量存储

  常用的基础矩阵:

  zeros(m,n)   //m×n的全零矩阵(参数取值可以有多个,一个参数 n 时,生成 n 阶方阵。下同)

  eye(n)     //n阶单位矩阵

  ones(m,n)   //m×n的全 1 矩阵

  常用的矩阵操作:

  reshape(A,m,n)    //将矩阵A重排列为m×n的矩阵(列优先)

  inv(A)         //逆矩阵

  ,A           //转置矩阵

  常用的随机矩阵:

   rand(m,n)       //产生一个元素在0-1之间且满足正态分布的m×n随机矩阵,单个参数时产生方阵

  randn(m,n)      //产生一个元素均值为0,方差为1的正态分布的m×n随机矩阵,单个参数时产生方阵

  randi(max,m,n)   //产生一个元素值为0 - max-1的m×n随机整数矩阵

   对矩阵的翻转操作(较常用于图像操作):

    fliplr(A)          //矩阵元素左右翻转
    flipud(A)          //矩阵元素上下翻转
    rot90(A,n)         //矩阵元素逆时针旋转90°的n倍,n是可选参数,默认为1

   元素取整操作

  fix(X)                //向零取整
  floor(X)              //向小取整
  round(X)             //四舍五入
  ceil(X)               //向大取整    

 

获得矩阵行列数

  [ row  col ] = size(A)     //获得二维矩阵 A 的行数和列数,返回值同样为矩阵形式

 

访问矩阵元素的方式

  访问单个矩阵元素:(  Matlab 的索引从 1 开始 )

  索引方式:A( n )           //取矩阵的第 n 个元素(MATLAB中以列序优先存储)

  坐标方式:A( i , j )        //取矩阵 i 行 j 列的元素

  访问子矩阵:

  使用 ':' 来指定需要访问的行数和列数。

  A( i , : )               //取矩阵 i 行所有的元素

  A( i : j , m : n)          //取矩阵 i 到 j 行上的 m 到 n 列的元素(返回的数据包括 j 行的元素)

    注意:通过 [ ] 来定义矩阵,通过 ( )来访问矩阵元素。

 

脚本程序

  脚本是一系列MALTAB语句的集合,MATLAB脚本加入了循环、判断等控制结构,是一种简单的程序设计语言·。

  脚本存放在后缀为 .m 的脚本文件中。对于名为 file1.m 的脚本文件(当前目录下),通过控制台键入 file1 按回车键,会执行其中包含的语句。也可以在编辑窗口选中部分语句,通过右键 -> 运行 或 F9运行脚本中的部分语句。脚本的运行结果相当于将脚本中的每条语句分别在命令行中键入执行的结果。

注释

  MATLAB中添加注释的方法主要有两种:

  (1)通过符号 % ,符号 % 会将该符号所在行作为注释(仅将出现在 % 后面的命令或字符视为注释) ;

  (2)选中需要注释的部分,通过快捷键 Ctrl + R 添加注释,通过快捷键 Ctrl + T 取消注释;

 

循环结构

  脚本中的循环结构以关键字 for、while等关键字开始,以end作为结束标志

  for循环

  for 表达式                    //如形如 循环变量 = 矩阵表达式 的结构,将矩阵表达式的中的矩阵元素依次赋值给循环变量,执行循环语句
    循环语句            //合法的MATLAB的语句集合
  end                //循环结束的标志

  while循环

  while 表示式               //表达式结果为真时,执行循环语句
    循环语句          //合法的MATLAB的语句集合
  end              //循环结束的标志

  可以使用continue来跳过本次循环(进行下一次循环),break来跳出循环语句的执行。

 

条件判断

  条件判断语句使用 if / switch 等作为开始关键字,使用 end 作为结束关键字。

  if语句

  if 逻辑表达式
    执行语句
  end

   对于多重条件判断,使用 elseif 关键字。

    if 逻辑表达式
        执行语句
    elseif 逻辑表达式
        执行语句
    end

 

  switch语句

  switch  switch_expression
    case  case_expression    //不同于很多程序设计语言,case后面不需要加':'
        执行语句1
    case  case_expression    //MATLAB中switch结构执行一个分支后会直接跳出switch不再顺序执行,故不需要额外的break语句
        执行语句2
      ...
    otherwise
        执行语句
  end 

   以上逻辑表达式中,可以使用关系运算符,包括 < (小于), <=(小于等于) , >(大于) , >=(大于等于) , ~=(不等于)等;逻辑运算符,包括 &(与),|(或),~(非)等。

 

函数

  MATLAB中函数为执行某一特定功能的MATLAB语句的集合,函数同样存储在后缀为 .m 的文件中。

  函数与脚本的主要区别如下:

  (1)函数可以有输入参数和返回值,但脚本没有;

  (2)脚本中的变量是是存放在MATLAB基本工作空间的,而函数中的变量存放在函数工作空间(除特别声明)。前者在脚本运行结束后仍然存在,可通过clear清除,后者在函数执行结束后则失去空间。

 

函数定义

  函数定义借助关键字 function

  function 返回变量 = function_name(函数参数)
    函数体    //函数体为类似于脚本文件的MATLAB的执行语句集合

 

  简单的重排矩阵的函数:reshape_matrix

  function  newMatrix = reshape_matrix(A , row , col )

  newMatrix = reshape( A , row, col );

  可以通过 A = reshape_matrix( A , row , col )来调用函数。

 

静态变量与全局变量 

  MATLAB中的静态变量与全局变量作用效果略有区别。

 

特殊数据结构

字符串

  MATLAB中的字符串常量通过 ' ' 进行标志。字符串变量同样相当于矩阵,可以视为一个行向量,每个字符都是行向量的元素。通过上述矩阵元素的访问方法访问。

  

 

结构体变量

  结构体变量 = struct(元素名1,元素值1,元素名2,元素值2,...)

  结构体变量的成员通过 结构体变量 . 元素名 进行访问。这里元素名作为字符串标志符,需要用 ' ' 标志。

  

 

单元型变量

  可视为多种不同数据集合在一起的 '多维数组'.借助 { } 声明。

  

  可以看到A包含了不同的成员类型,对A成员类型的引用同样借助{},如访问第一个成员,则使用A{1}即可。

 

其他 

绘制图像

  plot( x , y ,option)    //x为向量时,则以x为横坐标,y中元素为纵坐标显示,若x与y为同维矩阵,则将x和y对应位置上的元素作为横纵坐标绘制图像
  subplot(m,n,p)        //绘制 m×n个子图像,p为当前使用的子图区域
  imshow(X)           //显示图像的函数,X为读入的矩阵值
  title('name')        //标识图像的名字
  xlabel('string')      //标识横坐标
  text(x,y,options)      //在(x,y)处标志图像说明,用于图像上一点的描述
  axis on/off               //开启/关闭坐标轴
  hold on           //保持现有的图像,可继续绘制另一个图形
  hold off           //重置hold状态至默认行为,即再次当用plot时,会清空原有的图像和其他状态    

  最后两个命令用于将多个图像绘制在一个界面上。hold on相当于开启保持状态,后续绘制图像时不会清空前面的图像,而hold off 关闭这个状态。

 

文件操作

  打开文件

  fileID = fopen( filename , permission) //以permission权限打开文件(可选),返回与文件对应的文件标识符,文件标识符为整数且值大于或等于3.若不能打开文件,则返回-1.

  fopen( 'all')            //返回一个文件标识符组成的矩阵

  filename = fopen( fileID)      //以fileID调用fopen函数时,返回文件路径名

  [ fileID , errmsg] = fopen(xx)     //errmsg为字符串类型,用来返回可能的错误信息

  读取文件

  A = fread( fileID,sizeA,precision)   //从fileID指定的文件中读取数据,填入A矩阵中,sizeA指定A的维数,precision指定解释输入的方式

                    //precision默认为 'uint8=>double' ,表示读入的值为uint8类型,并将结果以double类型输出

  [ A , msg_len ] = fread(xxx)      //meg_len返回读入矩阵A中的元素个数

 

图像操作

  A = imread( filename,format)      //filename指定图片路径名,format指定文件格式(系统可自行识别),用于读取图像。对于RGB图像,读取获得的图像为 H * W * C 的数据格式

  imwrite(A,filename,format)       //filename指定图像名称,A为待保存矩阵,format为保存格式,用于保存图像。

  对于RGB图像,可以提取特定的色彩分量

  

  R = A( : , : , 1)             //得到RGB图像的红色分量

  图像分量合并

  A = cat(dim,A,B,...)           //将矩阵A、B、...按照dim指定的维数进行连接

  I = cat( 3 , A , B )             //第1、2维长度为A、B矩阵的长度,第3维长度为用于矩阵连接的矩阵的个数,这里为2

                         //A[ 0 , 0 , 0]即表示第0行 第0列 矩阵A的元素

  图像转换:

  Image = im2bw(X , level)    //根据level将彩色图像转换为二值图像,将 亮度(luninance)>level 的像素值赋值为1,其余为0.

  Image = rgb2gray( X )      //将图像 X 转换为灰度图像 

  Image = rgb2ycbcr( X )       //RGB转YCbCr

  Image = ycbcr2rgb( X )       //YCbCr转RGB

  

  图像采样

  image = imresize( A , scalar )      //返回一个大小为原图像 scalar 倍的采样图像

  image = imresize( A , scalar , 'bicubic')  //指定进行采样的方法,可以使用包括 'bicubic','nearest','bilinear' 等方法   

 

  分块操作

  blkproc(A , [m,n] , fun , p1 , p2 , ...)  //A为操作对象,[m,n]规定分块的子矩阵的长度,fun为对子矩阵进行的函数操作,p1、p2等为fun函数使用的参数

 

生成伪随机数

  伪随机数是以某个特定种子为起点产生的随机数序列。在种子值一定时,随机数函数在每次程序运行时产生的随机数序列总是固定的,故称为伪随机。

  较新版本的MATLAB可以通过函数 rng 设置伪随机数生成的种子,再使用随机数生成函数如randi等生成随机数序列。如 rng(8),则后续的randi函数生成以8为种子的伪随机序列。

  较早版本的MATLAB中,设置随机数种子的操作借助rand等函数实现。

  rand('seed' , seed_value)

  randn('seed' , seed_value)    //通过seed_value来设置随机数种子

  rand('state' , state_value)

  randn('state',state_value)      //通过stata_value来设置随机数种子

  上述写均能设置随机数种子,不过 'seed' 和 'state'字段调用了不同的随机数生成器(生成随机数的算法不同)。

 

misc

  1.在 Matlab 脚本中引用其他目录下的脚本等

  Matlab 脚本默认只能调用与脚本同一目录下的其他脚本,为了使用其他不同目录结构下的脚本功能,可以在脚本开始处通过 addpath 命令添加欲使用的脚本的目录路径,进而进行调用。

    addpath /path/to/folder        //添加欲调用的其他脚本的目录

 

  2.批量读取图片的常用做法

    filepaths = dir( fullfile( folder , '*.png') );    
    
    for  i  =  1 : length( filepaths )
        image = imread( fullfile( folder , filepaths(i).name) );
        ...other operations...

posted on 2017-10-25 10:32  yhjoker  阅读(25733)  评论(0编辑  收藏  举报

导航