matlab数组基础知识(MATLAB快速入门官方说明)
matlab数组基础知识(MATLAB快速入门官方说明)size(M) ans = 4 4 24注意A = magic(4); M = zeros(4 4 24); for k = 1:24 M(: : k) = A(: p(k :)); end将含有 24 个幻方矩阵的序列存储在三维数组 M 中。M 大小为三维数组可表示在矩形网格中采样的三维物理数据,例如室内温度。或者也可以表示矩阵序列 A(k) 或与时间相关的矩阵示例 A(t)。在下面的示例中,第 k 个或第 tk 个矩阵的第 (i j) 个元素由 A(i j k) 表示。MATLAB 与丢勒的 4 阶幻方矩阵版本的区别在于交换了两个列。通过交换列,可以生成许多不同的幻方矩阵。语句p = perms(1:4);生成 4! = 24 置换1:4。第 k 个置换为行向量 p(k :)。然后,
数组类型
多维数组
MATLAB® 环境中的多维数组是具有多个下标的数组。创建多维数组的一种方法是调用具有多个参数的 zeros
、ones
、rand
或 randn
。例如,
R = randn(3 4 5);
创建一个 3×4×5 数组,共包含 3*4*5 = 60
个正态分布的随机元素。
三维数组可表示在矩形网格中采样的三维物理数据,例如室内温度。或者也可以表示矩阵序列 A(k) 或与时间相关的矩阵示例 A(t)。在下面的示例中,第 k 个或第 tk 个矩阵的第 (i j) 个元素由 A(i j k)
表示。
MATLAB 与丢勒的 4 阶幻方矩阵版本的区别在于交换了两个列。通过交换列,可以生成许多不同的幻方矩阵。语句
p = perms(1:4);
生成 4! = 24 置换1:4
。第 k
个置换为行向量 p(k :)
。然后,
A = magic(4); M = zeros(4 4 24); for k = 1:24 M(: : k) = A(: p(k :)); end
将含有 24 个幻方矩阵的序列存储在三维数组 M
中。M
大小为
size(M) ans = 4 4 24
注意
此插图中显示的矩阵顺序可能不同于您的结果。perms
函数始终返回输入向量的所有置换,但置换顺序可能因不同 MATLAB 版本而异。
使用以下命令可以检索 4×4 幻方矩阵
M{4}
字符与文本
使用单引号在 MATLAB 中输入文本。例如,
s = 'Hello'
其结果与您目前已学过的数值矩阵或数组不属于同一类型,而是一个 1×5 字符数组。
字符在内部作为数字存储,而不会采用浮点格式存储。语句
a = double(s)
将字符数组转换为数值矩阵,该矩阵包含每个字符的 ASCII 代码的浮点表示。结果为
a = 72 101 108 108 111
语句
s = char(a)
是刚才转换的逆转换。
将数字转换为字符可以调查计算机上的各种可用字体。基本 ASCII 字符集中的可打印字符由整数 32:127
表示。(小于 32 的整数表示不可打印的控制字符。)这些整数使用以下语句按相应的 6×16 数组的形式排列
F = reshape(32:127 16 6)';
扩展 ASCII 字符集中的可打印字符由 F 128
表示。将这些整数解释为字符时,结果取决于当前使用的字体。键入语句
char(F) char(F 128)
然后改变命令行窗口所用的字体。要更改字体,请在主页标签上的环境部分中,点击预设 > 字体。如果代码行中包含制表符,请使用等宽字体(例如,Monospaced
)以便在不同行中对齐制表符位置。
使用方括号进行串联可将文本变量联接到一起。语句
h = [s ' world']
水平联接字符并生成
h = Hello world
语句
v = [s; 'world']
垂直联接字符并生成
v = Hello world
请注意,必须在 h
中的 'w'
前插入一个空格,并且 v
中的两个单词的长度必须相同。生成的数组均为字符数组;h
为 1×11,v
为 2×5。
要操作包含不同长度的行的文本主体,您有两种选择,即使用填充的字符数组或使用字符向量元胞数组。创建字符数组时,数组各行的长度必须相同。(使用空格填充较短行的末尾。)char
函数可执行这种填充操作。例如,
S = char('A' 'rolling' 'stone' 'gathers' 'momentum.')
生成一个 5×9 字符数组:
S = A rolling stone gathers momentum.
再者,您也可以将文本存储在元胞数组中。例如,
C = {'A';'rolling';'stone';'gathers';'momentum.'}
创建一个不需要任何填充的 5×1 元胞数组,因为该数组的各行可以具有不同的长度:
C = 'A' 'rolling' 'stone' 'gathers' 'momentum.'
使用以下语句可以将填充后的字符数组转换为字符向量元胞数组:
C = cellstr(S)
使用以下语句可以逆转此过程
S = char(C)
结构体
结构体是多维 MATLAB 数组,包含可按文本字段标志符访问的元素。例如,
S.name = 'Ed Plum'; S.score = 83; S.grade = 'B '
创建一个具有三个字段的标量结构体:
S = name: 'Ed Plum' score: 83 grade: 'B '
与 MATLAB 环境中的所有其他内容一样,结构体也为数组,因此可以插入其他元素。在本示例中,数组的每个元素都是一个具有若干字段的结构体。可以一次添加一个字段,
S(2).name = 'Toni Miller'; S(2).score = 91; S(2).grade = 'A-';
也可以使用一个语句添加整个元素:
S(3) = struct('name' 'Jerry Garcia' ... 'score' 70 'grade' 'C')
现在,结构体非常大以致仅输出摘要:
S = 1x3 struct array with fields: name score grade
将不同字段重新组合为其他 MATLAB 数组的方法有许多种。这些方法大多基于逗号分隔列表的表示法。键入
S.score
与键入
S(1).score S(2).score S(3).score
相同,这是一个逗号分隔列表。
如果将生成此类列表的表达式括在方括号中,MATLAB 会将该列表中的每一项都存储在数组中。在本示例中,MATLAB 创建一个数值行向量,该向量包含结构体数组 S
的每个元素的 score
字段:
scores = [S.score] scores = 83 91 70 avg_score = sum(scores)/length(scores) avg_score = 81.3333
要根据某个文本字段(例如,name
)创建字符数组,请对 S.name
生成的逗号分隔列表调用 char
函数:
names = char(S.name) names = Ed Plum Toni Miller Jerry Garcia
同样,通过将生成列表的表达式括入大括号中,可以根据 name
字段创建元胞数组:
names = {S.name} names = 'Ed Plum' 'Toni Miller' 'Jerry Garcia'
要将结构体数组的每个元素的字段赋值给结构体外部的单独变量,请指定等号左侧的每个输出,并将其全部括在方括号中:
[N1 N2 N3] = S.name N1 = Ed Plum N2 = Toni Miller N3 = Jerry Garcia
动态字段名称
访问结构体中的数据的最常用方法是指定要引用的字段的名称。访问结构体数据的另一种方法是使用动态字段名称。这些名称将字段表示为变量表达式,MATLAB 会在运行时计算这些表达式。此处显示的点-括号语法将 expression
作为动态字段名称:
structName.(expression)
使用标准 MATLAB 索引语法创建此字段的索引。例如,要在字段名称中计算 expression
,并在行 7
中的 1
至 25
列内获取该字段的值,请使用
structName.(expression)(7 1:25)
动态字段名称示例- 下面显示的 avgscore
函数可用于计算考试的平均分数,并使用动态字段名称检索 testscores
结构体中的信息:
function avg = avgscore(testscores student first last) for k = first:last scores(k) = testscores.(student).week(k); end avg = sum(scores)/(last - first 1);
您可以运行此函数,并对动态字段 student
使用不同值。首先,对包含 25 周内的分数的结构体进行初始化:
testscores.Ann_Lane.week(1:25) = ... [95 89 76 82 79 92 94 92 89 81 75 93 ... 85 84 83 86 85 90 82 82 84 79 96 88 98]; testscores.William_King.week(1:25) = ... [87 80 91 84 99 87 93 87 97 87 82 89 ... 86 82 90 98 75 79 92 84 90 93 84 78 81];
现在,运行 avgscore
,并在运行时使用动态字段名称为 testscores
结构体提供学生姓名字段:
avgscore(testscores 'Ann_Lane' 7 22) ans = 85.2500 avgscore(testscores 'William_King' 7 22) ans = 87.7500