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

Function is not defined for 'cell' inputs.

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

任何人都可以帮助我提前谢谢

4

4 回答 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'

等等。为什么?显然,此代码尝试将嵌套单元格数组连接到字符串(包含字符矩阵的单元格数组,这些字符构成字符串,如“香蕉”)。所以,正确答案是

利用 {:}

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

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

提示

一些提示:

  • 无索引循环与结构很好地配合,如for fruit = [fieldnames][1](fruits)'
  • 以上对于开源八度都是正确的
  • 香蕉不仅是水果,在分类学上它也是一种草本植物 ;-) 就像 MATLAB 中的 'banana' 既是字符串又是矩阵,即 assert(isstr('banana') && ismat('banana')) 通过,但是断言(iscell('banana'))失败。
  • {:}相当于cell2mat

附言

您的问题的解决方案可能如下所示:

给定

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'

可以串联。

于 2013-03-18T22:41:45.173 回答
7

假设我们有一个单元格如下:

my_cell = {'Hello World'}  
class(my_cell)
ans = 
cell

我们可以简单地通过直接在其上使用运算符来从中取出字符串{:}

   class(my_cell{:})
    ans =
    char

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

于 2013-04-21T01:23:05.467 回答
2

尝试这个:

sprintf('   %.5f',x{:})

(根据一些谷歌结果工作。)

于 2012-12-30T15:17:02.497 回答
2

通过查看 strjoin.m 文件,我发现了这一点:

string = [x{:}];
于 2016-09-02T07:48:29.600 回答