1多维数组
 
         MATLAB 环境中的多维数组是具有多个下标的数组。创建多维数组的一种方法是调用具有多个参数的 zeros 
 、 
 ones 
 、 
 rand 
  或  
 randn 
 。例如,  
 
R = randn(3,4,5); 
         创建一个 3×4×5 数组,共包含 3*4*5 = 60 
  个正态分布的随机元素。  
 
 
         三维数组可表示在矩形网格中采样的三维物理数据,例如室内温度。或者也可以表示矩阵序列 A(k) 或与时间相关的矩阵示例 A(t)。在下面的示例中,第 k 个或第 t 
 k  
  个矩阵的第 (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 版本而异。  
 
 
 语句  
 
sum(M,d) 
         通过改变第 d 
  个下标来计算总和。因此  
 
sum(M,1) 
 是一个含有 24 个行向量副本的 1×4×24 数组 34 34 34 34  
 而  
 
sum(M,2) 
 是一个含有 24 个列向量副本的 4×1×24 数组  
 
 
 34  
 
 
 34  
 
 
 34  
 
 
 34  
 
 
 最后,  
 
S = sum(M,3) 
         在序列中添加 24 个矩阵。结果的大小为 4×4×1,因此它看似是 4×4 数组:  
 
 
 S =  
 
 
 204 204 204 204  
 
 
 204 204 204 204  
 
 
 204 204 204 204  
 
 
 204 204 204 204  
 
2元胞数组
 
          MATLAB 中的元胞数组是以其他数组的副本为元素的多维数组。使用 cell 函数可以创建空矩阵的元胞数组。但是,更普遍的做法是,通过将其他内容的集合括入花括号  
  {} 中来创建元胞数组。花括号还可以与下标配合使用,以便访问各个元胞的内容。例如,  
 
 
 C = {A sum(A) prod(prod(A))} 
          生成一个 1×3 元胞数组。这三个元胞包含幻方矩阵、列总和的行向量及其所有元素的乘积。当显示 C 
  时,您会看到  
 
 
  
  C =  
 
 
  
  [4x4 double] [1x4 double] [20922789888000]  
 
 
  
          这是因为前两个元胞太大,无法在此有限空间中输出,但第三个元胞仅包含 16! 一个数字,因此有空间可以输出此数字。请牢记以下两大要点。第一,要检索某个元胞的内容,请在花括号中使用下标。例如, 
  C{1} 检索幻方矩阵, 
  C{3} 为 16!。第二,元胞数组包含其他数组的副本,而不包含指向这些数组的指针。如果随后更改A 
  , 
  C 
   不会发生变化。  
 
 
  
          使用三维数组可以存储相同大小的矩阵序列。元胞数组可用于存储不同大小的矩阵序列。例如,  
 
 
 M = cell(8,1);
for n = 1:8
M{n} = magic(n);
end
M 
          生成具有不同顺序的幻方矩阵序列:  
 
 
  
  M =  
 
 
  
  [ 1]  
 
 
  
  [ 2x2 double]  
 
 
  
  [ 3x3 double]  
 
 
  
  [ 4x4 double]  
 
 
  
  [ 5x5 double]  
 
 
  
  [ 6x6 double]  
 
 
  
  [ 7x7 double]  
 
 
  
  [ 8x8 double] 
 
 
  
 
  
          使用以下命令可以检索 4×4 幻方矩阵  
 
 
 M{4}3字符与文本
 
          使用单引号在 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)4结构体
 
           结构体是多维 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  
   
 
    
   5动态字段名称
 
            访问结构体中的数据的最常用方法是指定要引用的字段的名称。访问结构体数据的另一种方法是使用动态字段名称。这些名称将字段表示为变量表达式,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 
    
 
   








![[javascript核心-08] V8 内存管理机制及性能优化](https://img-blog.csdnimg.cn/img_convert/81364972f4fea6cdac2ce1d20746b796.png)









