MATLAB基础知识

2021/6/30 MATLAB

# 一、概述

# 1、主要特点

  • 计算功能强大
  • 绘图简单方便
  • 功能强大的工具箱
  • 帮助功能完整

# 2、MATLAB系统组成

MATLAB系统有五大部分组成:

①开发环境:一套便于用户使用MATLAB函数和文件的工具集,集成化工作区,图形化用户界面

②数学函数库:包括大量算法,从基本运算到复杂运算

③语言:高级语言,基于矩阵/数组

④图形处理系统:可以方便的图形化显示向量和矩阵,且能对图形添加标注和打印

⑤程序接口:使MATLAB更加方便的调用C和Fortran程序,建立客户端/服务器的关系

# 二、数据类型

# 1、数值类型

基本数值类型主要就是整数、单精度浮点数和双精度浮点数

其中整数包括有符号和无符号整数两种

注意:在未加说明的情况下,MATLAB默认对所有数值按照双精度浮点数类型进行存储和操作

MATLAB中将变量设置为整数类型时,需要使用相应的转换函数

转换过程中,程序默认将待转换数值转化为与之最接近的整数值

取整函数:

floor(x) 向下取整

ceil(x)向上取整

round(x)取最接近的整数,如果小数部分是0.5,则向绝对值大的方向取整

fix(x)向0取整

浮点数类型分为单精度浮点和双精度浮点,其在存储位宽、数值范围方面据有所不同

single(x)是单精度浮点的转换函数,double(x)是双精度浮点的转换函数

注意:单精度浮点类型不能与整数类型进行算术运算

此外,MATLAB中使用Inf和-Inf来表示无穷量,分别是正无穷和负无穷

# 2、逻辑类型

逻辑类型表示的是布尔类型的数据和数据之间的逻辑关系,用于解决真假命题的问题

对于true表示为1,对于false表示为0

在MATLAB中直接使用大于小于等于符号来判断和表示其之间的关系(和其他语言类似)

其中不同的是:不等于不再使用!=来表示,而是使用~=来表示

在MATLAB中不再使用!作为非,而是用~进行代替

# 3、字符和字符串

在MATLAB中文本当作特征字符串或简单地当作字符串

一个字符串是一个行向量中的文本,这个行向量中的每一个元素代表一个字符

元素中存放的是字符的内部代码,即为ASCⅡ码

# 4、函数句柄

MATLAB中函数的调用方法有两种:

  • 直接调用法:被调用函数通常被称作子函数。但是子函数只能被与其M文件的同名主函数或在M文件中的其他函数调用
  • 间接调用法:实际上间接调用法就是使用了句柄,创建句柄时使用@符号,通过函数句柄来实现对这些函数的间接调用

注意:一个文件中只能有一个主函数

创建函数句柄的一般格式:

Function_Handle = @Function_Handle

# 5、结构体类型

一个结构体可以通过字段存储多个不同类型的数据

结构体更像是一个数据容器,将多个相关联的不同类型的数据封装在一个结构体对象中

(1)通过赋值创建结构体

>> Student.Name = "Sam";
>> Student.Grade = 6;
>> Student.Subject = {'Chinese', 'Math', 'English'};
>> Student.Result = {99, 99, 99};
>> Student

Student = 

  struct with fields:

       Name: "Sam"
      Grade: 6
    Subject: {'Chinese'  'Math'  'English'}
     Result: {[99]  [99]  [99]}

(2)通过struct函数创建结构体

句法:StrArray = struct('field1', var1, 'field2',var2, ...)

上述语句中可以创建结构对象StrArry,并将其n个字段分别赋值为var1, var2 ...

>> StrArray(2) = struct('Day', 'Thursday', 'Time', '15:00', 'Number', 18)

StrArray = 

  1×2 struct array with fields:

    Day
    Time
    Number
    
    
>> StrArray(2)

ans = 

  struct with fields:

       Day: 'Thursday'
      Time: '15:00'
    Number: 18

# 6、数组类型

在MATLAB中进行运算的所有数据类型,都是按照数组及矩阵的形式进行存储和运算的

数组的创建方法:

  • 直接赋值
Array = [1 2 3 4 5 6]
  • 冒号创建

在MATLAB中可以使用冒号来代表一系列的数值,有时也可以用来定义数组:Array = i : kArray = i : j : k

Array = i : k
% 创建由i开始,步长为1,到k结束的序列

Array = i : j : k
% 创建由i开始,步长为j,到k结束的序列
  • 预定义函数

在MATLAB中使用linspace函数创建线性序列

Array = linspace(a, b, 100)
% 在区间[a, b]上创建一个有100个元素的向量,这100个数把整个区间线性分割

Array = linspace(a, b, n)
% 在区间[a, b]上创建一个有n个元素的向量

如:

 >> Array_a = linspace(0, 5, 6)

Array_a =

     0     1     2     3     4     5

# 7、单元数组类型

单元数组是一种无所不包的广义矩阵,组成单元数组的每一个元素称为一个单元。

使用单元数组的目的在于,它可以把不同类型的数据归并在一个数组中

# 7.1单元数组的创建

  • 使用赋值语句创建:

使用{}创建,使用,或空格隔开单元,使用;分行

>> C = {'x', [1; 2; 3]; 10, pi}

C =

  2×2 cell array

    {'x' }    {3×1 double}
    {[10]}    {[  3.1416]}
  • 使用cell函数创建空单元数组

cellName = cell(m, n)

该函数创建一个m * n的空单元数组,每一个单元均为一个空矩阵

>> a = cell(2, 3)

a =

  2×3 cell array

    {0×0 double}    {0×0 double}    {0×0 double}
    {0×0 double}    {0×0 double}    {0×0 double}

注意:和一般数组一样,单元数组的内存空间也是动态分配的。

使用cell函数创建数组单元的主要目的是该单元数组预先分配连续的存储空间,用于节约内存占用,提高执行效率

# 7.2单元数组的寻访

对于单元数组C:

  • C(m, n)指的是单元数组中第m行,第n列的单元
  • C{m, n}指的是单元数组中第m行,第n列单元中的内容
>> unitVar_1 = C{1, 1}

unitVar_1 =

    'x'
    
>> unitVar_2 = C(1, 1)

unitVar_2 =

  1×1 cell array

    {'x'}

# 7.3单元数组的操作

(1)合并

>> a{1, 1} = 'cellclass';
>> a{1, 2} = [1, 2, 3];
>> a{2, 1} = ['a', 'b', 'c'];
>> a{2, 2} = [9, 5, 6]

a =

  2×3 cell array

    {'cellclass'}    {[1 2 3]}    {0×0 double}
    {'abc'      }    {[9 5 6]}    {0×0 double}

(2)删除

删除某个单元只需要将空矩阵赋值给该单元即可

# 8、map容器类型

实际上map存储的就是许多个键值对

# 8.1map的创建

mapObj = containers.Map({key1, key2, key3, ...}, {val1, val2, val3, ...})

>> mapObj = containers.Map({'Monday', 'Tuesday', 'Wednesday'}, {'Maths', 'Chinese', 'History'})

mapObj = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: char

# 8.2map的读取

  • 查看所有的key:keys(mapObj)
  • 查看所有的value:values(mapObj)
  • 读取map对象:valueName = mapName(keyName)

# 8.3map的编辑

(1)删除

使用remove函数从map对象中删除键值对:remove('mapName', 'keyName')

(2)添加

向map对象添加新元素时,需要提供键名,且该键的类型必须和map中的其他建一致:existingMapObj(newKeyName) = newValue

(3)修改key

只能删除再添加

(4)修改value

通过赋值覆盖