通过案例讲解MATLAB中的数据类型

2024-08-08 17:01:50 浏览数 (2)

0. array(数组)

在matlab中,数据的基本单位是数组(array),数组就是组织成行和列的数据值的组合,单个的数据值是通过数组名和圆括号中的下标来进行访问的,下标用来确定某个值的行和列。在matlab中,标量也被看成数组来处理,即一行一列的数组。其中数组又可以分为向量(vector)和矩阵(matrix),向量是指只有一维的数组,矩阵是指二维及二维以上的数组。

在MATLAB中,数组是一种基本的数据结构,用于存储和处理数据。数组可以是多维的,可以包含数字、文本、逻辑值等不同类型的元素。下面是关于MATLAB中数组的一些重要概念和特点:

创建数组

  • 一维数组
代码语言:javascript复制
% 行向量
rowVector = [1, 2, 3, 4, 5];

% 列向量
columnVector = [1; 2; 3; 4; 5];
  • 多维数组
代码语言:javascript复制
% 二维数组
matrix = [1, 2, 3; 4, 5, 6; 7, 8, 9];

% 三维数组
threeDArray = cat(3, [1, 2; 3, 4], [5, 6; 7, 8]);
>> threeDArray = cat(3, [1, 2; 3, 4], [5, 6; 7, 8])

threeDArray(:,:,1) =

     1     2
     3     4


threeDArray(:,:,2) =

     5     6
     7     8

>> help cat
 cat - 串联数组。
    此 MATLAB 函数 沿维度 dim 将 B 串联到 A 的末尾。

    C = cat(dim,A,B)
    C = cat(dim,A1,A2,...,An)

    输入参数
        dim - 沿其运算的维度
            正整数标量
        A - 第一个输入
            标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表
        B - 第二个输入
            标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表
        A1,A2,...,An - 输入列表
            逗号分隔的列表
  • 常用操作
代码语言:javascript复制
A = []; % 创建一个空数组
B = ones(1, 5); % 创建一个1行5列的一维全1数组
C = zeros(2, 3); % 创建一个2行3列的全0数组
R = rand(3, 4); % 用随机分布函数产生一个3行4列的数组

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 冒号 start:interval:end 表示从start开始,每次增加interval,直到end(或小于end的最大整数),interval是步长
>> D = [1:2:10]

D =

     1     3     5     7     9

>> D = [1:10]

D =

     1     2     3     4     5     6     7     8     9    10
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% linspace(start,end,n)表示创建一个从start开始,到end结束的等差数列,公差为(end-start)/(n-1)
>> E = [linspace(4,6,3)]

E =

     4     5     6

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>> F = zeros(3,3,3); % 创建一个三维数组
F(:,:,1) = [1,2,3; 4,5,6; 7,8,9];
F(:,:,2) = [1,2,3; 4,5,6; 7,8,9];
F(:,:,3) = [1,2,3; 4,5,6; 7,8,9];
>> F

F(:,:,1) =

     1     2     3
     4     5     6
     7     8     9


F(:,:,2) =

     1     2     3
     4     5     6
     7     8     9


F(:,:,3) =

     1     2     3
     4     5     6
     7     8     9

>> 

数组索引和切片

代码语言:javascript复制
% 获取数组元素
element = matrix(2, 3);

% 获取数组的一部分
subset = matrix(1:2, 2:3);
>> matrix = [1, 2, 3; 4, 5, 6; 7, 8, 9]

matrix =

     1     2     3
     4     5     6
     7     8     9

>> subset = matrix(1:2, 2:3)

subset =

     2     3
     5     6

特殊类型的数组

  • 逻辑数组
代码语言:javascript复制
% 创建逻辑数组
logicalArray = [true, false, true; false, true, false];
  • 字符数组
代码语言:javascript复制
% 创建字符数组
charArray = ['Hello'; 'World'];

常见操作

  • 运算
代码语言:javascript复制
% 数组加法
result = matrix   2;

% 数组乘法
result = matrix * 3;

% 数组排序
sort(matrix);

% 数组的转置
result = matrix';

% 数组的扩展
result = [matrix1 matrix2]; % 将数组matrix2添加到数组matrix1的后面

% 数组的除法与求逆
A/B % 右除等价于A*inv(B)
% 右除也可用于解方程组
>> A = [2 1; 1 3];
b = [4; 7];
x = A  b % 解线性方程组 Ax = b

x =

     1
     2

>> 
  • 函数
代码语言:javascript复制
% 求和
sumResult = sum(matrix);

% 平均值
meanResult = mean(matrix);

数组的大小和维度

代码语言:javascript复制
% 获取数组的大小
sizeOfMatrix = size(matrix); % size得到的是数组的行和列
lengthOfMatrix = length(matrix); % length得到的是行和列的较大值

% 获取数组的维度
numberOfDimensions = ndims(matrix);

处理缺失值

MATLAB 中可以使用 NaN(Not a Number)表示缺失值。

代码语言:javascript复制
% 创建包含缺失值的数组
arrayWithNaN = [1, NaN, 3; 4, 5, 6; 7, 8, 9];

1. double(双精度浮点数):

在MATLAB中,double 是一种数值数据类型,用于存储双精度浮点数(64位浮点数),占用8字节。double是matlab中默认的数据类型。

代码语言:javascript复制
>> x = 3.14; % 双精度浮点数
>> whos x
  Name      Size            Bytes  Class     Attributes

  x         1x1                 8  double
代码语言:javascript复制
>> a;
>> class(a) % 查看数据类型

ans =

    'double'

创建 double 数组

代码语言:javascript复制
% 创建一个双精度浮点数数组
A = [1.0, 2.5, 3.7; 4.2, 5.9, 6.1];

特点和精度

  • double 类型在MATLAB中是默认的浮点数类型。
  • 它占用64位内存,提供15-16位有效数字的精度。
  • 能够表示很大范围的实数,包括整数和小数。

常用操作

代码语言:javascript复制
% 加法
result = A   2.0;

% 乘法
result = A * 3.0;

% 元素-wise 幂运算
result = A.^2;

% 转置
transposedA = A';

% 矩阵乘法
matrixProduct = A * B;

% 求逆
inverseA = inv(A);

特殊值

double 类型可以表示特殊的值,例如:

  • Inf(正无穷)和 -Inf(负无穷)。
  • NaN(非数字)用于表示未定义或不可表达的结果。
代码语言:javascript复制
% 创建一个包含特殊值的数组
specialArray = [1.0, Inf, -Inf, NaN];

类型转换

MATLAB允许将其他类型转换为double 类型。例如,将整数数组转换为双精度浮点数数组:

代码语言:javascript复制
% 将整数数组转换为 double 类型
integerArray = [1, 2, 3];
doubleArray = double(integerArray);

数组的大小和内存占用

double 数组的大小取决于元素的数量和维度。在MATLAB中,可以使用 whos 命令查看变量的详细信息,包括其类型、大小和内存占用。

代码语言:javascript复制
% 查看变量信息
whos A;

2. single(单精度浮点数):

存储单精度浮点数,占用4字节。

代码语言:javascript复制
>> y = single(3.14); % 单精度浮点数
>> whos y
  Name      Size            Bytes  Class     Attributes

  y         1x1                 4  single

3. int8, int16, int32, int64(有符号整数):

存储不同范围的有符号整数。

代码语言:javascript复制
>> a = int8(10); % 8位有符号整数
b = int16(-32768); % 16位有符号整数
c = int32(2147483647); % 32位有符号整数
d = int64(-9223372036854775808); % 64位有符号整数
>> whos a b c d
  Name      Size            Bytes  Class    Attributes

  a         1x1                 1  int8               
  b         1x1                 2  int16              
  c         1x1                 4  int32              
  d         1x1                 8  int64

4. uint8, uint16, uint32, uint64(无符号整数):

存储不同范围的无符号整数。

代码语言:javascript复制
>> e = uint8(255); % 8位无符号整数
f = uint16(65535); % 16位无符号整数
g = uint32(4294967295); % 32位无符号整数
h = uint64(18446744073709551615); % 64位无符号整数
>> whos e f g h
  Name      Size            Bytes  Class     Attributes

  e         1x1                 1  uint8               
  f         1x1                 2  uint16              
  g         1x1                 4  uint32              
  h         1x1                 8  uint64

5. char(字符)和string(字符串):

存储单个字符或字符串。

代码语言:javascript复制
>> charVar = 'A'; % 单个字符
strVar = 'Hello, MATLAB!'; % 字符串
>> whos charVar strVar
  Name         Size            Bytes  Class    Attributes

  charVar      1x1                 2  char               
  strVar       1x14               28  char

在MATLAB中,字符串(string)是用于存储字符序列的数据类型。字符串可以使用单引号或双引号括起来表示。以下是使用字符串的一些示例:

创建字符串变量:

代码语言:javascript复制
str = 'Hello, World!';

创建字符串数组:

代码语言:javascript复制
>> str = ["hello", "matlab","!!!"]

str = 

  1×3 string 数组

    "hello"    "matlab"    "!!!"

连接字符串:

代码语言:javascript复制
>> str1 = 'Hello';  
str2 = 'World';  
% 对比下面几种形式的输出结果
str3 = [str1   " "   str2] 
str4 = [str1   ' '   str2] 
str5 = str1   ' '   str2
str6 = str1   " "   str2
str7 = strcat(str1, " ", str2)

str3 = 

    "Hello World"


str4 =

   191   244   254   248   243


str5 =

   191   244   254   248   243


str6 = 

    "Hello World"


str7 = 

    "Hello World"

字符串中的字符访问:

代码语言:javascript复制
>> str = 'abcdef';  
first_char = str(1) % 输出:'a'  
last_char = str(end) % 输出:'f'

first_char =

    'a'


last_char =

    'f'

字符串比较:

代码语言:javascript复制
>> str1 = 'abc';  
str2 = 'def';  
is_equal = isequal(str1, str2) % 输出:0 (false)

is_equal =

  logical

   0

>> whos is_equal
  Name          Size            Bytes  Class      Attributes

  is_equal      1x1                 1  logical

字符串的子串提取:

代码语言:javascript复制
>> str = 'Hello, World!';  
sub_str = str(2:4) % 输出下标为2-4的字符

sub_str =

    'ell'

字符串的替换操作:

代码语言:javascript复制
>> str = 'Hello, World!';  
new_str = strrep(str, 'World', 'MATLAB') % 输出:'Hello, MATLAB!'

new_str =

    'Hello, MATLAB!'

单引号(')和双引号(")的区别

在MATLAB中,单引号(')和双引号(")用于创建字符数组或字符串。它们在使用方式和功能上有一些区别。

  • 单引号(')

单引号用于创建字符数组。创建的数组是一个大小为1×n或n×1的矩阵,其中n是字符串的长度。例如:

代码语言:javascript复制
str1 = 'Hello';  % 创建字符数组

单引号创建的是字符数组,而不是字符串。在MATLAB中,字符数组的元素可以是字符,也可以是数值。例如:

代码语言:javascript复制
charArray = ['H', 'e', 'l', 'l', 'o'];  % 创建字符数组
  • 双引号(")

双引号用于创建字符串。从MATLAB R2016b版本开始,引入了字符串数据类型。字符串是一种更灵活、更易于处理的数据类型,因为它可以包含文本、数字和特殊字符。

代码语言:javascript复制
str2 = "Hello";  % 创建字符串

双引号创建的是字符串,其中的元素可以是字符、数字等。双引号字符串支持更多的操作,例如拼接、查找、替换等。

  • 区别总结
    • 单引号创建字符数组,元素可以是字符或数值。
    • 双引号创建字符串,元素可以是字符、数值等。
    • 从MATLAB R2016b版本开始,建议使用双引号创建字符串,因为字符串数据类型更为灵活和功能丰富。
    • 在一些特殊情况下,比如需要明确字符数组的维度时,可以使用单引号创建字符数组。

6. logical(逻辑值):

存储逻辑值 truefalse

代码语言:javascript复制
isTrue = true;
isFalse = false;

7. cell(单元数组):

存储不同类型和大小的数据。单元数组(Cell Array)将类型不同的相关数据集成到一个单一的变量中,使得大量相关数据的引用和处理变得简单方便;需要注意的是,单元数组仅仅是承载其他数据类型的容器,大部分的数学运算只是针对其中的具体数据进行的,而非针对单元数组本身进行。单元数组中的每一个元素称为单元(cell),单元可以包含任何类型的数据,如数值数组、字符、符号对象,甚至于其他的单元数组。单元数组可以使不同类型和不同维数的数组可以共存,细胞型数组实际上可以认为是一种以任意形式的数组为分量的多维数组。

代码语言:javascript复制
cellVar = {1, 'text', [2 3; 4 5]}; % 不同类型的数据

在MATLAB中,cell 是一种特殊的数据类型,它可以用来存储不同数据类型的元素,包括数字、文本、数组、结构等。cell 数组是一种容器,可以容纳不同大小和类型的数据。

创建 cell 数组

在 MATLAB 中,可以使用花括号 {} 来创建 cell 数组。

代码语言:javascript复制
% 创建一个空的 cell 数组
emptyCell = cell(1, 0);

% 创建一个包含数字、文本和数组的 cell 数组
mixedCell = {1, 'Hello', [2, 4, 6]};

% 创建一个包含不同大小的数组的 cell 数组
sizeCell = {rand(2, 3), magic(4), 'MATLAB'};

访问和修改 cell 数组中的元素

使用花括号 {} 来访问和修改 cell 数组中的元素。例如:

代码语言:javascript复制
% 访问 cell 数组中的元素
value1 = mixedCell{1};  % 获取第一个元素
value2 = mixedCell{2};  % 获取第二个元素

% 修改 cell 数组中的元素
mixedCell{3} = 'World';  % 将第三个元素修改为 'World'

cell 数组的索引

与常规数组不同,cell 数组的索引是以花括号 {} 形式进行的。例如:

代码语言:javascript复制
% 创建一个包含多个元素的 cell 数组
myCell = {'apple', 42, [1, 2, 3], magic(3)};

% 访问第三个元素的第二个值
value = myCell{3}(2);  % 获取 [1, 2, 3] 数组的第二个元素

处理 cell 数组的函数

MATLAB 提供了一些专门用于处理 cell 数组的函数,例如:

  • cellfun: 对 cell 数组中的每个元素应用函数。
  • cell2mat: 将 cell 数组转换为常规数组。
  • mat2cell: 将常规数组分割成 cell 数组。

8. struct(结构体):

结构体用来存储不同字段的数据。结构是包含一组记录的数据类型,而数据则是存储在相应的字段中。结构的字段可以是任意一种MATLAB数据类型的变量或者对象。结构类型的变量可以是一维的、二维的或多维的数组。结构体也叫结构数组,架构数组。不过,在访问结构体类型的元素时,需要使用下标配合字段的形式。

可以在一个结构体中放置各类的数据,并且一个结构体还能是另一个结构体的一部分,即结构体的嵌套使用。相比较而言,结构体比元胞数组更为强大,也更加富于变化。

创建struct

可以使用以下两种方式之一来创建结构体:

  • 使用struct函数,该函数可以产生或者把其他形式的数据转换为struct结构。
代码语言:javascript复制
>> % 使用struct函数创建结构体
person = struct('name', 'John', 'age', 25, 'city', 'New York')

person = 

  包含以下字段的 struct:

    name: 'John'
     age: 25
    city: 'New York'

>>
  • 使用点运算符,与建立普通数组一样,建立struct对象不需要事先声明,可以直接引用并动态扩充。
代码语言:javascript复制
>> % 使用点运算符创建结构体
person.name = 'John';
person.age = 25;
person.city = 'New York';
>> person

person = 

  包含以下字段的 struct:

    name: 'John'
     age: 25
    city: 'New York'

>> person.gender = 'girl';
>> person

person = 

  包含以下字段的 struct:

      name: 'John'
       age: 25
      city: 'New York'
    gender: 'girl'

访问和修改结构体中的字段

可以使用点运算符来访问和修改结构体中的字段:

代码语言:javascript复制
% 访问结构体中的字段
nameValue = person.name;  % 获取'name'字段的值

% 修改结构体中的字段
person.age = 26;  % 将'age'字段的值修改为26

结构体的字段类型

结构体的字段可以包含各种MATLAB支持的数据类型,包括数字、文本、数组、甚至其他结构体。这使得结构体成为组织和表示复杂数据的理想选择。

代码语言:javascript复制
% 结构体中包含不同类型的字段
student = struct('name', 'Alice', 'grades', [85, 90, 92], 'contact', struct('email', 'alice@example.com', 'phone', '555-1234'));

嵌套结构体

结构体中的字段可以是其他结构体,形成嵌套结构:

代码语言:javascript复制
% 嵌套结构体
building.floor1.room1 = struct('occupant', 'Bob', 'status', 'occupied');
building.floor1.room2 = struct('occupant', 'Alice', 'status', 'vacant');

结构体操作函数

MATLAB中专门用于对结构体操作的函数并不多,如下所示。

  • struct:创建结构或将其他数据类型转变成结构;
  • fieldnames:获取结构的字段名称;
  • getfield:获取结构的字段数据;
  • setfield:设置结构的字段数据;
  • rmfield:删除结构的指定字段;
  • isfield:判断给定的 字符串 是否为结构的字段名称,是,返回真,否,返回假;
  • isstruct:判断给定的数据对象是否为结构类型,是,返回真,否,返回假;
  • orderfields:将结构字段排序,按ASCII码排序。

9. table(表格):

在MATLAB中,table 是一种用于组织和存储二维表格数据的数据类型。table 是一种表格型数据结构,类似于电子表格软件中的数据表,可以存储不同类型的数据,具有列名和行标签。

创建表格

可以使用以下方式之一来创建表格:

  • 直接创建
代码语言:javascript复制
>> % 创建一个包含3行4列的表格
data = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12];
% 指定列名和行名
colNames = {'Column1', 'Column2', 'Column3', 'Column4'};
rowNames = {'Row1', 'Row2', 'Row3'};
% 创建表格,为每一列指定列名
% T = array2table(data, 'VariableNames', colNames, 'RowNames', rowNames)
T = table(data(:, 1), data(:, 2), data(:, 3), data(:, 4), 'VariableNames', colNames, 'RowNames', rowNames)

T =

  3×4 table

            Column1    Column2    Column3    Column4
            _______    _______    _______    _______

    Row1       1          2          3          4   
    Row2       5          6          7          8   
    Row3       9         10         11         12
  • 从其他数据结构转换
代码语言:javascript复制
>> % 从数组转换为表格
data = [1, 2, 3; 4, 5, 6; 7, 8, 9];
colNames = {'Column1', 'Column2', 'Column3'};
rowNames = {'Row1', 'Row2', 'Row3'};
myTable = array2table(data, 'VariableNames', colNames, 'RowNames', rowNames)

myTable =

  3×3 table

            Column1    Column2    Column3
            _______    _______    _______

    Row1       1          2          3   
    Row2       4          5          6   
    Row3       7          8          9   

>>

访问和修改表格中的数据

  • 访问数据
代码语言:javascript复制
% 访问表格中的数据
value = myTable{'Row2', 'Column3'};  % 获取特定行和列的值
columnData = myTable.Column2;  % 获取整列的值
  • 修改数据
代码语言:javascript复制
% 修改表格中的数据
myTable{'Row2', 'Column3'} = 10;  % 修改特定行和列的值
myTable.Column1 = myTable.Column1 * 2;  % 修改整列的值

处理表格的函数

MATLAB 提供了一些专门用于处理表格的函数,例如:

  • sortrows: 对表格按行进行排序。
  • innerjoin, outerjoin, join: 表格之间的连接操作。
  • groupsummary: 对表格进行分组汇总。
代码语言:javascript复制
% 使用sortrows对表格按行进行排序
sortedTable = sortrows(myTable, 'Column1', 'descend');

表格的特性

  • 列的数据类型

表格中的每列可以有不同的数据类型,允许存储混合类型的数据。

代码语言:javascript复制
% 创建包含不同类型数据的表格
mixedTable = table({'apple'; 42; [1, 2, 3]}, 'VariableNames', {'MixedData'});
  • 缺失值

表格可以包含缺失值(NaN,Not a Number)或其他指定的缺失标记。

代码语言:javascript复制
% 创建包含缺失值的表格
missingTable = table([1; NaN; 3], 'VariableNames', {'ColumnWithMissing'});

10. datetime(日期和时间):

存储日期和时间信息。在MATLAB中,datetime 是一种用于表示日期和时间的数据类型,它提供了处理日期和时间的丰富功能。

创建 datetime 对象

可以使用 datetime 函数来创建日期和时间对象:

代码语言:javascript复制
% 创建当前日期和时间
currentDateTime = datetime;

% 根据字符串创建日期和时间
customDateTime = datetime('2023-11-15 12:30:00', 'Format', 'yyyy-MM-dd HH:mm:ss');

% 根据年、月、日、时、分、秒创建日期和时间
specificDateTime = datetime(2023, 11, 15, 12, 30, 0);

常见属性和方法

  • 属性:
    • Year, Month, Day, Hour, Minute, Second: 获取日期和时间的年、月、日、时、分、秒。
    • Format: 日期和时间的显示格式。
代码语言:javascript复制
% 获取日期和时间的年份
yearValue = year(customDateTime);
  • 方法:
    • datevec: 将 datetime 转换为日期向量。
    • datestr: 将 datetime 转换为日期字符串。
    • days: 计算两个日期之间的天数差。
    • hours, minutes, seconds: 获取时间部分的小时、分钟、秒数。
代码语言:javascript复制
% 将 datetime 转换为日期向量
dateVector = datevec(customDateTime);

时间运算

datetime 对象支持日期和时间的运算,可以方便地进行时间加减和计算时间间隔:

代码语言:javascript复制
% 加减日期和时间
newDateTime = customDateTime   days(7);

% 计算时间间隔
timeDifference = newDateTime - customDateTime;

格式化显示

datetime 对象可以以不同的格式显示:

代码语言:javascript复制
% 将 datetime 转换为日期字符串
dateString = datestr(customDateTime, 'yyyy/mm/dd HH:MM:SS');

处理缺失值

datetime 对象可以包含缺失值,用 NaT(Not a Time)表示:

代码语言:javascript复制
% 创建包含缺失值的 datetime 对象
missingDateTime = NaT;

11. duration(持续时间):

存储时间间隔。

代码语言:javascript复制
timeInterval = duration(0, 1, 30); % 0小时,1分钟,30秒

在MATLAB中,duration 是一种表示时间段的数据类型,用于存储时间的长度,以天、小时、分钟、秒为单位。duration 可以用于表示两个时间点之间的时间差,也可以与其他时间单位进行转换。以

创建 duration 对象

可以使用 duration 函数来创建时间段对象:

代码语言:javascript复制
>> % 创建一分钟的时间段
oneMinute = duration(0, 1, 0)

% 创建一小时三十分钟五秒的时间段
customDuration = duration(1, 30, 5)

oneMinute = 

  duration

   00:01:00


customDuration = 

  duration

   01:30:05

常见属性和方法

  • 属性:
    • Days, Hours, Minutes, Seconds: 获取时间段的天数、小时数、分钟数、秒数。
代码语言:javascript复制
% 获取时间段的分钟数
minutesValue = minutes(customDuration);
  • 方法:
    • plus, minus: 对时间段进行加法和减法操作。
    • abs: 获取时间段的绝对值。
    • between: 判断某个时间点是否在两个时间点之间。
代码语言:javascript复制
% 计算时间段的绝对值
absoluteDuration = abs(customDuration);

时间运算

duration 对象支持时间段的运算,可以方便地进行加减和计算时间差:

代码语言:javascript复制
% 加减时间段
newDuration = customDuration   oneMinute;

% 计算时间差
timeDifference = newDuration - customDuration;

格式化显示

duration 对象可以以不同的格式显示:

代码语言:javascript复制
% 将 duration 转换为字符串
durationString = char(customDuration);

处理缺失值

duration 对象可以包含缺失值,用 NaT(Not a Time)表示。

12. function_handle(函数句柄):

存储指向函数的句柄。在MATLAB中,function_handle 是一种特殊的数据类型,表示对函数的句柄或引用。通过函数句柄,您可以将函数作为变量传递、存储和调用。function_handle 类型通常用于创建函数句柄,以便在运行时动态地选择要调用的函数。

创建函数句柄

  • 指定函数名称:
代码语言:javascript复制
funcHandle = @functionName;
  • 匿名函数:
代码语言:javascript复制
funcHandle = @(x) x.^2;

函数句柄的用途

  • 传递函数作为参数:函数句柄允许您将函数作为参数传递给其他函数,实现更灵活的函数调用。
代码语言:javascript复制
function result = applyFunction(func, x)
    result = func(x);
end

% 调用
squared = applyFunction(@(x) x.^2, 4);
  • 保存函数状态:函数句柄可以捕获创建时的工作区状态,包括变量和常量。
代码语言:javascript复制
a = 2;
funcHandle = @(x) x   a;

a = 5; % 修改 a 的值
result = funcHandle(3); % 仍然使用创建时的 a 值(2)
  • 数组中的函数句柄:函数句柄可以存储在数组中,形成函数句柄数组。
代码语言:javascript复制
funcArray = {@(x) x.^2, @(x) sqrt(x), @(x) sin(x)};
result = funcArray{2}(9); % 调用第二个函数
  • 处理不同函数的情况:函数句柄允许根据不同条件选择调用不同的函数。
代码语言:javascript复制
condition = true;

if condition
    funcHandle = @(x) x   1;
else
    funcHandle = @(x) x - 1;
end

result = funcHandle(3); % 结果根据条件选择调用的函数而变化
  • 函数句柄作为输出:函数可以返回函数句柄,使得调用方可以在不同情况下选择调用不同的函数。
代码语言:javascript复制
function result = chooseFunction(option)
    if option == 1
        result = @(x) x.^2;
    else
        result = @(x) sqrt(x);
    end
end

func = chooseFunction(1);
output = func(4); % 调用 x.^2

13. cellstr(单元数组字符串):

在MATLAB中,cellstr 是一个用于将文本数组转换为单元字符串数组的函数。MATLAB中的字符串数组是字符数组的一种,而单元字符串数组是一种特殊的数组,其中每个元素都是一个字符串。

cellstr 函数的语法如下:

代码语言:javascript复制
C = cellstr(A)

其中,A 是一个字符数组、字符向量或单元字符串数组,而 C 是一个单元字符串数组,其中包含了 A 中的每个元素。

例如,假设有一个字符数组:

代码语言:javascript复制
>> charArray = ["apple"; "banana"; "orange"]

charArray = 

  3×1 string 数组

    "apple"
    "banana"
    "orange"

使用 cellstr 函数可以将其转换为单元字符串数组:

代码语言:javascript复制
>> cellArray = cellstr(charArray)

cellArray =

  3×1 cell 数组

    {'apple' }
    {'banana'}
    {'orange'}

这样,cellArray 就是一个包含每个字符串的单元字符串数组。单元字符串数组在处理不定长度字符串或不同长度字符串时非常有用,因为每个元素可以包含不同长度的字符串。

需要注意的是,cellstr 主要用于将字符数组转换为单元字符串数组。如果要将其他类型的数据转换为字符串,可以使用 num2strint2strnum2cell 等函数,具体取决于数据类型。

14. categorical(分类数据):

categorical 数据类型用于处理有限个离散数值的数据。categorical 类型通常用于表示类别或标签,例如性别、颜色、评分等。

创建 Categorical 数组

  • 通过构造函数创建
代码语言:javascript复制
>> categories = {'Category1', 'Category2', 'Category3'};
data = {'Category1'; 'Category2'; 'Category1'; 'Category3'};
c = categorical(data, categories);
>> c

c = 

  4×1 categorical 数组

     Category1 
     Category2 
     Category1 
     Category3
  • 通过函数创建
代码语言:javascript复制
categories = {'Category1', 'Category2', 'Category3'};
data = {'Category1'; 'Category2'; 'Category1'; 'Category3'};
c = categorical(data, categories);

Categorical 数组的属性和方法

  • 查看分类类别:
代码语言:javascript复制
categories(c)
  • 查看分类的计数:
代码语言:javascript复制
summary(c)
  • 修改分类的顺序:
代码语言:javascript复制
newOrder = {'Category2', 'Category1', 'Category3'};
c = reordercats(c, newOrder);
  • 获取数值编码:
代码语言:javascript复制
codes = double(c);
  • 修改 Categorical 数组的标签:
代码语言:javascript复制
newLabels = {'Label1', 'Label2', 'Label3'};
c = renamecats(c, newLabels);

Categorical 数组的优势

  • 内存效率:categorical 类型可以显著减少存储相同类别的重复数据所需的内存。
  • 可读性:使用 categorical 类型可以提高数据的可读性,因为它们允许您为类别分配更有意义的标签而不是数值编码。
  • 数据分析:在某些情况下,categorical 类型可以提高数据分析的效率,例如在绘图或统计分析中。
  • 有序类别:categorical 类型可以是有序的,这对于表示有序类别(例如低、中、高)非常有用。
  • 避免错误:使用 categorical 类型可以防止一些由于类别错误或拼写错误引起的问题,因为它限制了可以使用的类别。

15. containers.Map(映射):

存储键-值对的映射。containers.Map 是 MATLAB 中用于实现关联数组(associative arrays)或字典(dictionary)的数据结构。它提供了一种将键(keys)与值(values)关联起来的方式,使得通过键来检索值变得非常高效。

创建 containers.Map 对象

代码语言:javascript复制
% 创建一个空的 containers.Map 对象
mapObj = containers.Map;

% 创建一个包含初始键值对的 containers.Map 对象
mapObj = containers.Map({'key1', 'key2', 'key3'}, {'value1', 'value2', 'value3'});

插入和访问元素

代码语言:javascript复制
% 插入键值对
mapObj('newKey') = 'newValue';

% 访问值
value = mapObj('newKey');

移除元素

代码语言:javascript复制
% 移除键值对
remove(mapObj, 'keyToRemove');

查询键或值

代码语言:javascript复制
% 查询是否包含特定键
containsKey = isKey(mapObj, 'keyToCheck');

% 查询是否包含特定值
containsValue = ismember('valueToCheck', values(mapObj));

获取所有键、值或键值对

代码语言:javascript复制
% 获取所有键
allKeys = keys(mapObj);

% 获取所有值
allValues = values(mapObj);

% 获取所有键值对
allKeyValuePairs = items(mapObj);

更新值

代码语言:javascript复制
% 更新特定键对应的值
mapObj('existingKey') = 'updatedValue';

容器属性

  • 容器大小:
代码语言:javascript复制
mapSize = length(mapObj);
  • 容器是否为空:
代码语言:javascript复制
isEmpty = isempty(mapObj);

containers.Map 的用途

  • 快速查找:containers.Map 对象在查找特定键对应的值时非常高效,相比于使用数组或结构体,特别适用于大型数据集的快速查找操作。
  • 动态更新:您可以方便地插入、删除和更新键值对,适用于需要动态维护键值关系的场景。
  • 数据关联:适用于将一组键关联到相应的值,类似于字典或哈希表。
  • 无序性:containers.Map 对象的键是无序的,如果需要有序的键,可以通过 keys 函数获取键的列表,然后进行排序。

0 人点赞