如何在MATLAB中访问嵌套单元数组?

时间:2010-06-21 16:44:42

标签: matlab nested cell-array

我想制作一个嵌套的单元格数组,如下所示:

tag = {'slot1'}
info = {' name' 'number' 'IDnum'}
x = {tag , info}

我希望能够致电x(tag(1))并让它显示'slot1'。相反,我收到了这个错误:

??? Error using ==> subsindex
Function 'subsindex' is not defined for values of class 'cell'.

如果我致电x(1),MATLAB会显示{1x1 cell}。我希望能够访问列表x中的第一个单元格,以便我可以与另一个字符串进行字符串比较。

我知道如果MATLAB的内置类不起作用但是有一个简单的技巧可以解决这个问题,我可以编写自己的类来做这个吗?

2 个答案:

答案 0 :(得分:12)

x(1)的返回值实际上是一个1乘1的单元格数组,其中包含另一个 1 x 1单元格数组,该数组本身包含字符串'slot1'。要访问单元格数组的内容(而不仅仅是单元格的子数组),您必须使用花括号(即"content indexing")而不是括号(即{ {3}})。

例如,如果要从'slot1'检索字符串x以进行字符串比较,可以通过以下两种方式之一来完成:

cstr = x{1};    %# Will return a 1-by-1 cell array containing 'slot1'
str = x{1}{1};  %# Will return the string 'slot1'

然后您可以将函数"cell indexing"与以上任一项一起使用:

isTheSame = strcmp(cstr,'slot1');  %# Returns true
isTheSame = strcmp(str,'slot1');   %# Also returns true

上述工作原理是因为MATLAB中的STRCMP与许多内置函数中的字符串和字符数组在某种程度上可以互换。

答案 1 :(得分:4)

您可以使用结构:

,而不是使用单元格数组
x(1) = struct('tag','slot1','info',{{'something'}}); %# using '1' in case there are many

然后,您将第一个标记作为

x(1).tag

或者,您可以使用标记名称作为字段名称。如果标签名称和信息是单元格数组,则可以传递单元格数组而不是“slot1”和“信息在这里”,并且您可以一次性创建结构。

x = struct('slot1','information here')
tagName = 'slot1';
%# access the information via tag names
x.(tagName)