Cell Array Syntax
两个问题:
1) 我发现了一段代码,上面写着 cellArr{x}{y}{3,8} = 1.0;,我想知道 {3,8} 是什么意思。该程序将连接图集合中的各个节点连接在一起。这里我们会说"在图 x 的集合中,图 y 从 3 到 8 的连接的顶点标签为 1.0"。不过,总的来说,MatLab 中的语法 {3,8} 是什么意思?
2) 这可能不是这个问题的地方,但如果我知道我总是会有顶点值,即小数/浮点数,我真的应该使用元胞数组吗?矩阵会更好吗,因为我知道我只会有一个数据类型?
谢谢你:)。
元胞数组可以有多个维度,因此它们可以像任何其他多维数组一样使用多个下标进行索引。语法 {3,8} 正在索引一个(大概)二维单元格数组,获取第三行第八列单元格的内容。
使用元胞数组有两个主要原因:存储不同类型的数据或存储不同大小的数据。假设 x 和 y 在您的示例中是标量索引,则 cellArr 是一个单元格数组,其中由 x 索引的单元格包含另一个单元格数组,其由 y 索引的单元格包含一个二维单元格数组它存储您的顶点标签。
现在,如果您的顶点标签都是相同的数据类型并且都是单个非空(即不是 [])值,那么最低级别的 2-D 元胞数组可以变成 2- D 数值数组,您的索引将如下所示:
1
| cellArr{x}{y}(3,8) = 1.0; %# Note the use of () instead of {} |
现在的问题变成了如何处理由 x 和 y 索引的两组封闭元胞数组。如果每个可以被 y 索引的单元格都包含大小和类型都相同的 2-D 数值数组,那么该单元格数组可以转换为可以像这样索引的 3-D 数值数组:
1
| cellArr{x}(3,8,y) = 1.0; %# Here I've chosen to use y as the third dimension |
最后,如果每个可以被 x 索引的单元格都包含同样大小和类型相同的 3-D 数值数组,那么 cellArr 可以被转换成一个 4-D 数值数组,像这样索引:
您可以根据自己的喜好更改下标的顺序(即 numArr 的尺寸),但我将 x 和 y 放在最后,这样如果您要索引顶点标签的子数组,例如numArr(:,:,y,x) 它将以二维数组的形式返回。如果您对索引进行了排序,这样您就可以索引一个顶点标签的子数组,如 numArr(x,y,:,:),它会将结果作为一个 4-D 数组返回,其中包含两个前导单例维度的数组(您必须使用类似的函数删除它们挤压)。
- "每个单元存储另一个单元阵列......每个单元存储另一个单元阵列......每个单元存储一个二维单元阵列" - 我认为这是不正确的,因为单元阵列可以存储任何数据类型和任何单元格中的大小。在这种特殊情况下,我们可以说在"cellArr"中由标量数字"x"索引的单元格包含另一个单元格数组,等等。
-
@yuk:是的,我基于以下假设进行概括:对于 OP 描述的特定问题,每个单元数组可能存储相同类型的数据。但是,我会按照您的建议完善文本。
语法 {3,8} 是元胞数组索引,就像 {x} 和 {y} 一样。所以 cellArr 是细胞向量的细胞向量。这些单元向量之一由 {x} 索引。该单元向量本身是由 {y} 索引的单元二维矩阵的向量。最后,这个单元矩阵由 {3,8} 索引,即第 3 行和第 8 列。
如果您的所有数据都是数字,那么您最好使用 4 维数组。对于您的示例,此数组将由 numericArray[x, y, 3, 8] 索引。