matlab 为什么cell 2mat将单元格数组转换为字符矩阵,而不是单元格内容矩阵?

mm5n2pyu  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(241)

我有这个细胞阵列

>> FooCellArray

FooCellArray =

  1×7 cell array

  Columns 1 through 4

    {'Foo1'}    {'Foo2'}    {'Foo3'}    {'Foo4'}

  Columns 5 through 7

    {'Foo5'}    {'Foo6'}    {'Foo7'}

cell2mat()将数组转换为字符数组,而不是'Foo1'的1x7或7x1矩阵...'Foo7'

>> (cell2mat(FooCellArray))'

ans =

  28×1 char array

    'F'
    'o'
    'o'
    '1'
    'F'
    'o'
    'o'
    '2'
    'F'
    'o'
    'o'
    '3'
    'F'
    'o'
    'o'
    '4'
    ....

为什么?

hs1ihplo

hs1ihplo1#

cell2mat执行的操作完全正确,如本文所述。每个cell元素是大小为1xN的char向量。您的整个cell阵列为1xN。cell2mat按照由cell数组的形状定义的“自然”方向连接每个单元格的内容。您最初的cell看起来有点像这样:

FooCellArray = [{'Foo1'}, {'Foo2'}]

cell2mat的效果基本上就像移除了{},所以只剩下

cell2mat(FooCellArray) --> ['Foo1', 'Foo2']

因此,它被连接到单个char向量'Foo1Foo2'中。
比较double的向量而不是char的向量:

>> FooCellArray = [{[1,2,3]}, {[4,5,6]}]
FooCellArray =
  1×2 cell array
    {[1 2 3]}    {[4 5 6]}
>> cell2mat(FooCellArray)
ans =
     1     2     3     4     5     6
cvxl0en2

cvxl0en22#

以下是一个较小的起始示例:

FooCellArray = {'Foo1','Foo2','Foo3'} ;

如果您的MatLab版本>=2017b
您可以直接使用函数convertCharsToStrings

>> convertCharsToStrings(FooCellArray)
ans = 
  1×3 string array
    "Foo1"    "Foo2"    "Foo3"

这种方法的好处是,即使单元格数组中包含的字符串长度不全相同,它也可以工作。如果您希望将其作为列而不是行向量,则可以对其进行转置。请注意结果类型的术语,它是string array
如果您的MatLab版本较旧,并且单元格数组中的所有字符串都具有相同的长度,则可以将单元格数组转换为2D字符数组:

>> reshape(cell2mat(FooCellArray),4,[]).'
ans =
  3×4 char array
    'Foo1'
    'Foo2'
    'Foo3'

对于这个人来说,换位并不是真的有意义。这个结果类型是char array,当它们是简单的向量时,它们还可以,但一旦它们在2D中,它们就变得非常笨拙。主要是因为它们不像字符串那样灵活,所以每一行都必须有相同数量的元素。因此,正如@adriaan指出的那样,如果您的某个单元格包含Foo24,则reshape命令将出错。
编辑:或者正如Chris Luengo在评论中友好地提到的那样,这是一个更简单的命令,可以获得完全相同的结果:

>> cell2mat(FooCellArray.')
ans =
  3×4 char array
    'Foo1'
    'Foo2'
    'Foo3'

这具有相同的限制,所有单元格内容必须具有相同的字符数,否则命令将出错。

相关问题