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

news2024/10/7 8:20:59

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,贝叶斯滤波与Kalman估计、多传感器信息融合,机器学习,人工智能,控制理论等相关领域的知识和技术。关注公粽号 《机器和智能》 回复关键词 “python项目实战” 即可获取美哆商城视频资源!


博主介绍:
CSDN优质创作者,CSDN实力新星,CSDN内容合伙人;
阿里云社区专家博主;
华为云社区云享专家;
51CTO社区入驻博主,掘金社区入驻博主,支付宝社区入驻博主,博客园博主。


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

      • 0. array(数组)
      • **1. double(双精度浮点数):**
      • 2. **single(单精度浮点数):**
      • **3. int8, int16, int32, int64(有符号整数):**
      • **4. uint8, uint16, uint32, uint64(无符号整数):**
      • **5. char(字符)和string(字符串):**
      • **6. logical(逻辑值):**
      • **7. cell(单元数组):**
      • **8. struct(结构体):**
      • **9. table(表格):**
      • **10. datetime(日期和时间):**
      • **11. duration(持续时间):**
      • **12. function_handle(函数句柄):**
      • **13. cellstr(单元数组字符串):**
      • **14. categorical(分类数据):**
      • **15. containers.Map(映射):**


专栏:《智能优化算法》


在这里插入图片描述

0. array(数组)

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

在这里插入图片描述

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

创建数组

  • 一维数组
% 行向量
rowVector = [1, 2, 3, 4, 5];

% 列向量
columnVector = [1; 2; 3; 4; 5];
  • 多维数组
% 二维数组
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 - 输入列表
            逗号分隔的列表
  • 常用操作
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

>> 

数组索引和切片

% 获取数组元素
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

特殊类型的数组

  • 逻辑数组
% 创建逻辑数组
logicalArray = [true, false, true; false, true, false];
  • 字符数组
% 创建字符数组
charArray = ['Hello'; 'World'];

常见操作

  • 运算
% 数组加法
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

>> 
  • 函数
% 求和
sumResult = sum(matrix);

% 平均值
meanResult = mean(matrix);

数组的大小和维度

% 获取数组的大小
sizeOfMatrix = size(matrix); % size得到的是数组的行和列
lengthOfMatrix = length(matrix); % length得到的是行和列的较大值

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

处理缺失值

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

% 创建包含缺失值的数组
arrayWithNaN = [1, NaN, 3; 4, 5, 6; 7, 8, 9];

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

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

>> x = 3.14; % 双精度浮点数
>> whos x
  Name      Size            Bytes  Class     Attributes

  x         1x1                 8  double              

>> a;
>> class(a) % 查看数据类型

ans =

    'double'

创建 double 数组

% 创建一个双精度浮点数数组
A = [1.0, 2.5, 3.7; 4.2, 5.9, 6.1];

特点和精度

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

常用操作

% 加法
result = A + 2.0;

% 乘法
result = A * 3.0;

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

% 转置
transposedA = A';

% 矩阵乘法
matrixProduct = A * B;

% 求逆
inverseA = inv(A);

特殊值

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

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

类型转换

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

% 将整数数组转换为 double 类型
integerArray = [1, 2, 3];
doubleArray = double(integerArray);

数组的大小和内存占用

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

% 查看变量信息
whos A;

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

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

>> y = single(3.14); % 单精度浮点数
>> whos y
  Name      Size            Bytes  Class     Attributes

  y         1x1                 4  single              

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

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

>> 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(无符号整数):

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

>> 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(字符串):

存储单个字符或字符串。

>> charVar = 'A'; % 单个字符
strVar = 'Hello, MATLAB!'; % 字符串
>> whos charVar strVar
  Name         Size            Bytes  Class    Attributes

  charVar      1x1                 2  char               
  strVar       1x14               28  char               

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

创建字符串变量:

str = 'Hello, World!';

创建字符串数组:

>> str = ["hello", "matlab","!!!"]

str = 

  1×3 string 数组

    "hello"    "matlab"    "!!!"

连接字符串:

>> 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"

字符串中的字符访问:

>> str = 'abcdef';  
first_char = str(1) % 输出:'a'  
last_char = str(end) % 输出:'f'

first_char =

    'a'


last_char =

    'f'

字符串比较:

>> 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              

字符串的子串提取:

>> str = 'Hello, World!';  
sub_str = str(2:4) % 输出下标为2-4的字符

sub_str =

    'ell'

字符串的替换操作:

>> str = 'Hello, World!';  
new_str = strrep(str, 'World', 'MATLAB') % 输出:'Hello, MATLAB!'

new_str =

    'Hello, MATLAB!'

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

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

  • 单引号(')

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

str1 = 'Hello';  % 创建字符数组

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

charArray = ['H', 'e', 'l', 'l', 'o'];  % 创建字符数组

  • 双引号(")

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

str2 = "Hello";  % 创建字符串

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

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

6. logical(逻辑值):

存储逻辑值 truefalse

isTrue = true;
isFalse = false;

7. cell(单元数组):

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

cellVar = {1, 'text', [2 3; 4 5]}; % 不同类型的数据

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

创建 cell 数组

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

% 创建一个空的 cell 数组
emptyCell = cell(1, 0);

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

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

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

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

% 访问 cell 数组中的元素
value1 = mixedCell{1};  % 获取第一个元素
value2 = mixedCell{2};  % 获取第二个元素

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

cell 数组的索引

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

% 创建一个包含多个元素的 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结构。
>> % 使用struct函数创建结构体
person = struct('name', 'John', 'age', 25, 'city', 'New York')

person = 

  包含以下字段的 struct:

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

>> 

  • 使用点运算符,与建立普通数组一样,建立struct对象不需要事先声明,可以直接引用并动态扩充。
>> % 使用点运算符创建结构体
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'

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

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

% 访问结构体中的字段
nameValue = person.name;  % 获取'name'字段的值

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

结构体的字段类型

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

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

嵌套结构体

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

% 嵌套结构体
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 是一种表格型数据结构,类似于电子表格软件中的数据表,可以存储不同类型的数据,具有列名和行标签。

创建表格

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

  • 直接创建
>> % 创建一个包含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   


  • 从其他数据结构转换
>> % 从数组转换为表格
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   

>> 

访问和修改表格中的数据

  • 访问数据
% 访问表格中的数据
value = myTable{'Row2', 'Column3'};  % 获取特定行和列的值
columnData = myTable.Column2;  % 获取整列的值

  • 修改数据
% 修改表格中的数据
myTable{'Row2', 'Column3'} = 10;  % 修改特定行和列的值
myTable.Column1 = myTable.Column1 * 2;  % 修改整列的值

处理表格的函数

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

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

表格的特性

  • 列的数据类型

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

% 创建包含不同类型数据的表格
mixedTable = table({'apple'; 42; [1, 2, 3]}, 'VariableNames', {'MixedData'});

  • 缺失值

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

% 创建包含缺失值的表格
missingTable = table([1; NaN; 3], 'VariableNames', {'ColumnWithMissing'});

10. datetime(日期和时间):

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

创建 datetime 对象

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

% 创建当前日期和时间
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: 日期和时间的显示格式。
% 获取日期和时间的年份
yearValue = year(customDateTime);

  • 方法:
    • datevec: 将 datetime 转换为日期向量。
    • datestr: 将 datetime 转换为日期字符串。
    • days: 计算两个日期之间的天数差。
    • hours, minutes, seconds: 获取时间部分的小时、分钟、秒数。
% 将 datetime 转换为日期向量
dateVector = datevec(customDateTime);

时间运算

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

% 加减日期和时间
newDateTime = customDateTime + days(7);

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

格式化显示

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

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

处理缺失值

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

% 创建包含缺失值的 datetime 对象
missingDateTime = NaT;

11. duration(持续时间):

存储时间间隔。

timeInterval = duration(0, 1, 30); % 0小时,1分钟,30秒

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

创建 duration 对象

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

>> % 创建一分钟的时间段
oneMinute = duration(0, 1, 0)

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

oneMinute = 

  duration

   00:01:00


customDuration = 

  duration

   01:30:05


常见属性和方法

  • 属性:
    • Days, Hours, Minutes, Seconds: 获取时间段的天数、小时数、分钟数、秒数。
% 获取时间段的分钟数
minutesValue = minutes(customDuration);

  • 方法:
    • plus, minus: 对时间段进行加法和减法操作。
    • abs: 获取时间段的绝对值。
    • between: 判断某个时间点是否在两个时间点之间。
% 计算时间段的绝对值
absoluteDuration = abs(customDuration);

时间运算

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

% 加减时间段
newDuration = customDuration + oneMinute;

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

格式化显示

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

% 将 duration 转换为字符串
durationString = char(customDuration);

处理缺失值

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

12. function_handle(函数句柄):

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

创建函数句柄

  • 指定函数名称:
funcHandle = @functionName;

  • 匿名函数:
funcHandle = @(x) x.^2;

函数句柄的用途

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

% 调用
squared = applyFunction(@(x) x.^2, 4);

  • 保存函数状态:函数句柄可以捕获创建时的工作区状态,包括变量和常量。
a = 2;
funcHandle = @(x) x + a;

a = 5; % 修改 a 的值
result = funcHandle(3); % 仍然使用创建时的 a 值(2)

  • 数组中的函数句柄:函数句柄可以存储在数组中,形成函数句柄数组。
funcArray = {@(x) x.^2, @(x) sqrt(x), @(x) sin(x)};
result = funcArray{2}(9); % 调用第二个函数

  • 处理不同函数的情况:函数句柄允许根据不同条件选择调用不同的函数。
condition = true;

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

result = funcHandle(3); % 结果根据条件选择调用的函数而变化

  • 函数句柄作为输出:函数可以返回函数句柄,使得调用方可以在不同情况下选择调用不同的函数。
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 函数的语法如下:

C = cellstr(A)

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

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

>> charArray = ["apple"; "banana"; "orange"]

charArray = 

  3×1 string 数组

    "apple"
    "banana"
    "orange"

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

>> cellArray = cellstr(charArray)

cellArray =

  3×1 cell 数组

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


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

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

14. categorical(分类数据):

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

创建 Categorical 数组

  • 通过构造函数创建
>> categories = {'Category1', 'Category2', 'Category3'};
data = {'Category1'; 'Category2'; 'Category1'; 'Category3'};
c = categorical(data, categories);
>> c

c = 

  4×1 categorical 数组

     Category1 
     Category2 
     Category1 
     Category3 

  • 通过函数创建
categories = {'Category1', 'Category2', 'Category3'};
data = {'Category1'; 'Category2'; 'Category1'; 'Category3'};
c = categorical(data, categories);

Categorical 数组的属性和方法

  • 查看分类类别:
categories(c)

  • 查看分类的计数:
summary(c)

  • 修改分类的顺序:
newOrder = {'Category2', 'Category1', 'Category3'};
c = reordercats(c, newOrder);

  • 获取数值编码:
codes = double(c);

  • 修改 Categorical 数组的标签:
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 对象

% 创建一个空的 containers.Map 对象
mapObj = containers.Map;

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

插入和访问元素

% 插入键值对
mapObj('newKey') = 'newValue';

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

移除元素

% 移除键值对
remove(mapObj, 'keyToRemove');

查询键或值

% 查询是否包含特定键
containsKey = isKey(mapObj, 'keyToCheck');

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

获取所有键、值或键值对

% 获取所有键
allKeys = keys(mapObj);

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

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

更新值

% 更新特定键对应的值
mapObj('existingKey') = 'updatedValue';

容器属性

  • 容器大小:
mapSize = length(mapObj);

  • 容器是否为空:
isEmpty = isempty(mapObj);

containers.Map 的用途

  • 快速查找: containers.Map 对象在查找特定键对应的值时非常高效,相比于使用数组或结构体,特别适用于大型数据集的快速查找操作。

  • 动态更新: 您可以方便地插入、删除和更新键值对,适用于需要动态维护键值关系的场景。

  • 数据关联: 适用于将一组键关联到相应的值,类似于字典或哈希表。

  • 无序性: containers.Map 对象的键是无序的,如果需要有序的键,可以通过 keys 函数获取键的列表,然后进行排序。

在这里插入图片描述

在这里插入图片描述


❗❗❗重要❗❗❗☞关注下方公粽号 《机器和智能》 回复关键词 “python项目实战” 即可获取美哆商城视频资源!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1296957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法题】一种字符串压缩表示的解压(js)

输入:2dff 输出 !error 两个d不需要压缩,故输入不合法 输入:4eA 输出:!error 全部由小写英文字母组成,压缩后不会出现,故输出不合法 function solution(str) {const error "!error";// 只能包含小写字母和数字 [^a-z0…

[gRPC实现go调用go]

1什么是RPC RPC:Remote Procedure Call,远程过程调用。简单来说就是两个进程之间的数据交互。正常服务端的接口服务是提供给用户端(在Web开发中就是浏览器)或者自身调用的,也就是本地过程调用。和本地过程调用相对的就是:假如两个…

ardupilot开发 --- git 篇

一些概念 工作区:就是你在电脑里能看到的目录;暂存区:stage区 或 index区。存放在 :工作区 / .git / index 文件中;版本库:本地仓库,存放在 :工作区 / .git 中 关于 HEAD 是所有本地…

FPGA设计时序分析概念之Timing Arc

目录 1.1 Timing Arc概念 1.2 Timing Arcs的类型 1.3 Timing Sense(时序感知) 1.4 参考资料 1.1 Timing Arc概念 在时序工具对设计进行时序分析时,经常会看到一个概念Timing Arch(时序弧)。Timing Arc是一个信号一个单元Cell的输入引脚Pin到该单元输出引脚Outpu…

Python面向对象基础

Python面向对象基础 一、概念1.1面向对象的设计思想1.2 面向过程和面向对象1.2.1 面向过程1.2.2 面向对象1.2.3 面向过程和面向对象的优缺点 二、类和对象2.1 概念2.2 类的定义2.3 对象的创建2.3.1 类中未定义构造函数2.3.2 类中定义构造函数 2.4 类的设计 三、类中的成员3.1 变…

SAP UI5 walkthrough step3 Controls

在上一步&#xff0c;我们是直接用index.html 中的body 里面的DIVision去输出 hello world&#xff0c; 在这个章节&#xff0c;我们将用SAP UI5 的标准控件 sap/m/Text 首先&#xff0c;我们去修改 webapp/index.html <!DOCTYPE html> <html> <head><…

电脑软件:TileIconifier开始菜单美化工具介绍

目录 一、 软件介绍 二、软件功能 三、使用说明 四、软件下载 一、 软件介绍 TileIconifier是一款简单易用的win10开始菜单美化软件&#xff0c;该程序具备了简单直观的操作界面&#xff0c;打开软件后&#xff0c;您可以在快捷方式列表下选择要美化的快捷方式&#xff0c;…

年底不同外贸客户催单模板分享

最近工厂又爆单了&#xff0c;有些小的订单都没时间管了。时间过得很快&#xff0c;眼看就剩一个多月就春节&#xff0c;大家可以抓住这段时间催一下还有机会成单的客户&#xff0c;好为来年做准备&#xff01; 1.老客户模板 Dear xxx, Greetings. Do you have any new inqu…

springboot 集成Dubbo2.7.8 ,连接zookeeper 提示错误 zookeeper not connected

Dubbo 连接zookeeper时&#xff0c;提示“zookeeper not connected” java.lang.IllegalStateException: zookeeper not connectedat org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:83) ~[dubbo-2.7.8.jar:2.…

YouTube网红营销:出海品牌扩大影响力的关键

随着数字媒体的兴起&#xff0c;社交媒体已成为品牌与消费者之间建立联系的重要桥梁。其中&#xff0c;YouTube作为全球最大的视频分享平台&#xff0c;不仅拥有庞大的用户群体&#xff0c;还聚集了众多有影响力的网红。这些网红在各自的领域内拥有强大的话语权和号召力&#x…

需求产生技术,什么是光电混合缆?

光电混合缆是一种集成了光纤和导电铜线的混合形式的电缆&#xff0c;可以用一根线缆同时解决数据传输和设备供电的问题。在园区网络中&#xff0c;光电混合缆主要用于完成交换机与AP或远端模块之间的连接&#xff0c;用一根线缆同时完成AP或远端模块的数据传输和PoE供电。 随着…

快解析结合智邦国际使用教程

北京智邦国际软件技术有限公司&#xff0c;是经中华人民共和国工业和信息化部以及北京经济和信息化委员会评定和审核的双软企业&#xff0c;国家重点支持的高新技术企业。 十几年来致力于企业信息化&#xff0c;主要从事ERP、CRM、项目管理、人资管理、移动应用等企业管理软件的…

游戏王的题解

目录 原题&#xff1a; 时间&#xff1a;1s 空间&#xff1a;256M 题目描述 输入格式 输出格式 样例输入 样例输出 题目大意&#xff1a; 主要思路&#xff1a; dp转移&#xff1a; dp初始化&#xff1a; 代码&#xff1a; 原题&#xff1a; 时间&#xff1a;1s …

敏捷开发迭代缺陷统计的重要性

在敏捷开发中&#xff0c;迭代缺陷统计具有重要性&#xff0c;对团队和项目具有多方面的影响&#xff1a; 早期发现和解决问题&#xff1a; 迭代缺陷统计允许团队及时识别和定位在迭代中出现的问题。这有助于早期解决问题&#xff0c;避免问题扩大化&#xff0c;并最大程度地减…

MTU与MSS

MTU&#xff1a;一个网络包的最大长度&#xff0c;以太网中一般为1500各字节。 MSS&#xff1a;除去头部之后&#xff0c;一个网络包所能容纳的TCP数据的最大长度。 应用程序调用write后&#xff0c;将要发送的数据被交给TCP/IP协议栈进行。 协议栈不关心应用的数据内容&…

给你的Python程序添点Emoji魔法:使用Emoji模块增添趣味和个性!

当你想给你的Python程序增添一些趣味和个性时&#xff0c;Emoji模块是一个很有用的工具。Emoji模块允许你在Python中使用各种表情符号&#xff0c;从笑脸到动物&#xff0c;甚至是食物和天气等。在本篇博客中&#xff0c;我们将介绍如何在Python中使用Emoji模块&#xff0c;并展…

动态规划——完全背包问题(公式推导,组合、排列)

本文章是对于完全背包 一些题型(如题目所示&#xff0c;组合、排列和最小值类型)的总结和理解&#xff0c;依次记录一下&#xff0c;方便回顾与复习。 本文章是基于个人所总结 实现的&#xff0c;但在其中遇到了一些疑惑与困难&#xff0c;所以总结一篇与完全背包相关的问题。 …

本地数据备份与FTP远程数据迁移

数据是电脑中最重要的东西。为了保证数据安全&#xff0c;我们经常会对数据进行备份。之前一直采用将重要数据拷贝至移动硬盘的方式实现备份&#xff0c;实现简单但每次都需要把所有文件拷贝一次&#xff0c;当文件很大时效率较低。 因此&#xff0c;考虑使用 FreeFileSync 软…

【Flink系列五】Checkpoint及Barrier原理

本章内容 一致性检查点从检查点恢复状态检查点实现算法-barrier保存点Savepoint状态后端&#xff08;state backend&#xff09; 本文先设置一个前提&#xff0c;流处理的数据都是可回放的&#xff08;可以理解成消费的kafka的数据&#xff09; 一致性检查点&#xff08;che…

数据结构 | 查漏补缺之DFS、BFS、二次探测再散列法、完全二叉树、深度计算

目录 DFS&BFS 哈希表-二次探测再散列法 完全二叉树&深度计算 排序 快速排序-挖坑法 插入、选择、冒泡、区别 DFS&BFS 哈希表-二次探测再散列法 完全二叉树&深度计算 排序 快速排序-挖坑法 插入、选择、冒泡、区别 插入从第一个元素开始&#xff0c…