假设我有一个单元格
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)
任何人都可以提前帮助我
答案 0 :(得分: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)'
{:}
相当于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'
可以连接。
答案 1 :(得分:7)
假设我们有一个单元格如下:
my_cell = {'Hello World'}
class(my_cell)
ans =
cell
我们可以直接在其上使用{:}
运算符来获取字符串。
class(my_cell{:})
ans =
char
请注意,我们可以在任何可以使用普通字符串的地方使用表达式mycell{:}
。
答案 2 :(得分:2)
答案 3 :(得分:2)
通过查看strjoin.m文件,我发现了这个:
string = [x{:}];