我想制作一个嵌套的单元格数组,如下所示:
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的内置类不起作用但是有一个简单的技巧可以解决这个问题,我可以编写自己的类来做这个吗?
答案 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)