如何在Matlab中将单元格转换为字符串

18

假设我有一个细胞

v =    'v'    [576.5818]    [3.0286]    [576.9270]

       'v'    [576.5953]    [3.1180]    [576.8716]

       'f'    [      56]    [    58]    [      52]

       'f'    [      56]    [    58]    [      52]

我想使用格式字符串将其转换为单元数组:' %.5f'

我该如何做?我尝试了以下方法,但是出现了错误:

f1 = @(x) sprintf('   %.5f',x);
cellfun(f1, num2cell(v),'UniformOutput', false) 

我遇到了一个错误:???

Error using ==> sprintf

'cell'类型的输入不支持该函数。

Error in ==> @(x)sprintf(' %.5f',x)

请问有人能帮忙解决吗?非常感谢!

4个回答

21

字符串是一个矩阵

嗯,并不完全是这样,但请继续阅读。

我想在MATLAB中,单元数组可能是最神秘的数据类型。所以让我们稍微揭开迷雾吧 ;-)

假设

fruits = {...
    'banana',...
    'apple',...
    'orange'...
}

首先,对于小型数组,不需要使用整数索引。最好使用类似于foreach的结构。实际上,

for index = 1:numel(fruits)
    fruits{index}
end

等同于

for fruit = fruits
    fruit
end

对吗?

嗯,不完全正确。第一个循环生成字符串,而第二个循环生成单元格。您可以使用以下命令进行检查:

for index = 1:numel(fruits)
    [isstr(fruits{index}) iscell(fruits{index})]
end

for fruit = fruits
    [isstr(fruit) iscell(fruit)]
end

[1 0][0 1]

如果您发现了差异,那么您必须知道如何处理下一个示例(在这个示例中真的与您的问题相关 (!) 我保证!)。比如您尝试在循环中进行水平拼接:

for fruit = fruits
    [fruit 'is a fruit']
end

您将获得

ans = 

    'banana'    'is a fruit'

等等。为什么?显然,这段代码试图将嵌套的单元数组连接到字符串上(一个包含由字符矩阵构成的字符串的单元数组,例如 'banana')。因此,正确的答案是

使用 {:}

for fruit = fruits
    [fruit{:} 'is a fruit']
end

神奇的是,这已经产生了预期的'香蕉是水果''苹果是水果'等结果。

提示

一些提示:

  • 结构体与无需索引循环结合使用非常好,例如for fruit = [fieldnames][1](fruits)'
  • 以上适用于开源的Octave
  • 从分类学上讲,香蕉不仅仅是水果,还是草本植物;就像MATLAB中的'banana'既是字符串也是矩阵,即assert(isstr('banana') && ismat('banana'))通过,但assert(iscell('banana'))失败。
  • {:}等效于cell2mat

PS

对于你的问题,一个解决方案可能如下:

给定

vcell = {...
    'v'    576.5818    3.0286  576.9270;
    'v'    576.5818    3.0286  576.9270    
}

将仅包含数字类型的索引转换为字符串

 vcell(cellfun(@isnumeric, vcell)) =  cellfun(@(x) sprintf('%.5f', x), vcell(cellfun(@isnumeric, vcell)), 'UniformOutput', false)

以上代码输出:

vcell =

'v'    '576.58180'    '3.02860'    '576.92700'
'v'    '576.58180'    '3.02860'    '576.92700'
可以进行连接。

7
假设我们有一个单元格,如下所示:
my_cell = {'Hello World'}  
class(my_cell)
ans = 
cell

我们可以直接使用{:}操作符将其字符串化。
   class(my_cell{:})
    ans =
    char

请注意,我们可以在任何使用普通字符串的地方使用表达式 mycell {:}

干得好!永远不要说挖坟从来没有帮助过任何人。 - bright-star
调用不必要的函数sprintf被称为hack - 这真是个笑话。 - Yauhen Yakimovich

2

通过查看strjoin.m文件,我找到了以下内容:

string = [x{:}];

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接