感谢大家关注matlab爱好者公众号,今天给大家介绍matlab较为复杂一点的三个数据类型。在聊天栏中输入"013"、"元胞"、"结构体"、“函数”或 “句柄”即可快速获取本文章。
1 元胞数组
元胞数组是一种包含名为元胞的索引数据容器的数据类型,其中的每个元胞都可以包含任意类型的数据。元胞数组通常包含文本字符串列表、文本和数字的组合或不同大小的数值数组。通过将索引括在圆括号 () 中可以引用元胞集。使用大括号 {} 进行索引来访问元胞的内容。
① 元胞数组的创建
(a) 用花括号"{}"直接创建
例:C = {1,2,3;'text',rand(5,10,2),{11; 22; 33}};
(b) 采用cell(m,n,h,…)命令创建;
例:cell(3,5)
② 元胞数组的访问
引用元胞数组的元素有两种方法。将索引括在圆括号()中以引用元胞集。将索引括在大括号{}中以引用各个元胞中的文本、数字或其他数据。注意:大括号用于表示元胞的内容,小括号表示指定的元胞。要访问指定元胞中的具体元素,可以在元胞数组内容下标的后面加上指定数组元胞的下标。如:C{2,3}(3,1)表示元胞a{2,3}的元素(3,1)。
例:C = {1,2,3;'text',rand(5,10,2),{11; 22; 33}}; 则C{2,1} = text。
③ 不同类型转化
cell2mat:将元胞数组转换为基础数据类型的普通数组
cell2struct:将元胞数组转换为结构体数组
cell2table:将元胞数组转换为表
mat2cell:将数组转换为可能具有不同元胞大小的元胞数组
num2cell:将数组转换为相同大小的元胞数组
struct2cell:将结构体转换为元胞数组
table2cell:将表转换为元胞数组
优势:元胞数组可以存储不同类型和大小的数据,每一个元胞元都是一个微型数据存储器。在编程中,有时遇到需要把不同类型和大小数据统一存储的情况,这时元胞数据就是最好的选择。
2 结构体
结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型。每个字段都可以包含任意类型的数据。
① 结构体的创建
(a) 通过对“结构体名+不同字段”赋值来直接创建,
例2.1:
patient(1).name = 'John Doe';
patient(1).billing = 127.00;
patient(1).test = [79, 75, 73; 180, 178, 177.5];
(b) 使用关键字struct
s = struct('field1',values1,'field2',values2,…);
② 结构体的访问
使用 structName.fieldName 格式的圆点表示法来访问结构体中的数据。
例:对例2.1中姓名的访问可用patient(1).name。
③ 数据类型转化
struct2table:将结构体数组转换为表
table2struct:将表转换为结构体数组
struct2cell:将结构体转换为元胞数组
cell2struct:将元胞数组转换为结构体数组
3 函数句柄
函数句柄是一种存储函数关联项的数据类型。可以使用函数句柄构造匿名函数或指定回调函数。此外,也可以使用函数句柄将一个函数传递给另一个函数,或者从主函数外部调用局部函数。
① 函数句柄的创建与调用
通过在函数名称前添加一个@符号来为函数创建句柄。
例3.1:
fun= @(x) x.^2;
调用:
a = 4;
b = fun(a)
ans = 16;
例3.2:由函数句柄组成的数组
C = {@sin, @cos, @tan};
C{2}(pi)
ans = -1;
例3.3:使用结构体数组
S.a = @sin; S.b = @cos; S.c = @tan;
S.a(pi/2)
ans = 1;
② 函数传递
使用函数句柄作为其他函数(称为功能函数)的输入参数。这些函数基于某个范围内的值计算数学表达式。典型的功能函数包括integral、quad2d、fzero 和 fminbnd。
例 3.4:计算自然对数从 0 到 5 范围内的积分
a = 0;
b = 5;
q1 = integral(@log,a,b)
q1 = 3.0472;
③ 函数参数化
(a) 使用嵌套函数参数化
定义参数的一种方法是使用嵌套函数 - 完全包含于程序文件中另一个函数内的函数。
例 3.5
function y = findzero(b,c,x0)
y = fzero(@poly,x0);
% 嵌套函数poly
function y = poly(x)
y = x^3 + b*x + c;
end
end
(b) 使用匿名函数进行参数化
访问额外参数的另一种方法是使用匿名函数。匿名函数是可以在单个命令中定义而无需创建一个单独程序文件的函数。这些函数可以使用当前工作区中可用的任何变量。
例 3.6
b = 2;
c = 3.5;
cubicpoly = @(x) x^3 + b*x + c;
x = fzero(cubicpoly,0)
x = -1.0945
例 3.7:使用匿名函数调用在函数文件中定义的更复杂的目标函数
cubicpoly.m文件内容如下:
function y = cubicpoly(x,b,c)
y = x^3 + b*x + c;
end
调用:
b = 2;
c = 3.5;
x = fzero(@(x) cubicpoly(x,b,c),0)
x = -1.0945
温馨提示
如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。