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

时间:2012-11-06 20:03:19

标签: string matlab cell

假设我有一个单元格

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 个答案:

答案 0 :(得分:21)

String是一个单元格数组

嗯,不是真的..这是一个矩阵,但继续阅读。

我猜单元数组是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)'
  • 中的结构很好地配合使用
  • 以上为开源八度 true
  • 香蕉不仅仅是水果,在分类学上它也是一种草药;-)就像MATLAB中的'banana'一样是字符串和矩阵,即断言(isstr('banana')&& ismat('banana) '))传递,但断言(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'

可以连接。

答案 1 :(得分:7)

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

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

我们可以直接在其上使用{:}运算符来获取字符串。

   class(my_cell{:})
    ans =
    char

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

答案 2 :(得分:2)

试试这个:

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

(根据一些Google results工作。)

答案 3 :(得分:2)

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

string = [x{:}];