我有这个细胞阵列
>> 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'
....
为什么?
2条答案
按热度按时间hs1ihplo1#
cell2mat
执行的操作完全正确,如本文所述。每个cell
元素是大小为1xN的char
向量。您的整个cell
阵列为1xN。cell2mat
按照由cell
数组的形状定义的“自然”方向连接每个单元格的内容。您最初的cell
看起来有点像这样:cell2mat
的效果基本上就像移除了{}
,所以只剩下因此,它被连接到单个
char
向量'Foo1Foo2'
中。比较
double
的向量而不是char
的向量:cvxl0en22#
以下是一个较小的起始示例:
如果您的MatLab版本>=2017b
您可以直接使用函数
convertCharsToStrings
:这种方法的好处是,即使单元格数组中包含的字符串长度不全相同,它也可以工作。如果您希望将其作为列而不是行向量,则可以对其进行转置。请注意结果类型的术语,它是
string array
。如果您的MatLab版本较旧,并且单元格数组中的所有字符串都具有相同的长度,则可以将单元格数组转换为2D字符数组:
对于这个人来说,换位并不是真的有意义。这个结果类型是
char array
,当它们是简单的向量时,它们还可以,但一旦它们在2D中,它们就变得非常笨拙。主要是因为它们不像字符串那样灵活,所以每一行都必须有相同数量的元素。因此,正如@adriaan指出的那样,如果您的某个单元格包含Foo24
,则reshape
命令将出错。编辑:或者正如Chris Luengo在评论中友好地提到的那样,这是一个更简单的命令,可以获得完全相同的结果:
这具有相同的限制,所有单元格内容必须具有相同的字符数,否则命令将出错。