假设有一个字符数组,希望将其转换为数字向量。这可以使用str2num
或str2double
来完成。例如,
x={'0.17106'; '2.11462'; '4.13938'; '6.24203'}
cellfun(@str2num,x)
str2double(x)
与sscanf
相比,这些功能有点慢。但是,sscanf
需要额外的参数,使用普通的cellfun
语法似乎无法规范,例如,
cellfun(sscanf(>variable usually goes here<,'%f'),x)
如何将sscanf
应用于单元格数组的每个元素,或者更一般地说,如何使用cellfun
应用任何需要有序系列参数的函数?
答案 0 :(得分:2)
sscanf的包装器怎么样?
myWrapper = @(x) sscanf(x, '%f')
x={'0.17106'; '2.11462'; '4.13938'; '6.24203'}
cellfun(myWrapper,x)
str2double(x)
答案 1 :(得分:2)
要快速执行此操作,请勿使用cellfun
或str2double
。一些可能性:
strjoin
sscanf
使用strjoin
将单元格数组x
中的字符串组合成一个长的空格分隔字符串,然后可以使用sscanf
快速解析:
sscanf(strjoin(reshape(x,1,[])),'%f')
请注意,reshape
包含strjoin
以保证单元格数组符合.'
的要求。如果您知道x
是一列,则可以使用简单的置换(x
),如果vertcat
已经是一行,则可以使用任何内容。
str2mat
的sscanf
(或strjoin
)
而不是x{:}
,用sscanf
形成一个虚拟comma-separated list字符串,并用vertcat
垂直连接它们(如果每个字符串具有相同的字符数)。转置此2D字符数组,sscanf(vertcat(x{:})','%f');
可以再次快速解析它:
str2mat
或者,如果字符数因字符串而异,您可以使用sscanf
,这会创建一个空格填充的2D字符数组sscanf(str2mat(x)','%f');
也很乐意读取:
>> x = sprintfc('%f',rand(1e4,1));
创建一个包含10,000个随机数字符串表示的单元格数组:
sprintfc
请注意使用未记录的>> tic; d0 = str2double(x); toc
Elapsed time is 0.302148 seconds.
>> tic; d1 = cellfun(@(x) sscanf(x,'%f'),x); toc
Elapsed time is 0.277386 seconds.
>> isequal(d0,d1)
ans =
1
打印到单元格。
参考方法:
strjoin
vertcat
和>> tic; d2 = sscanf(strjoin(reshape(x,1,[])),'%f'); toc
Elapsed time is 0.068129 seconds.
>> isequal(d0,d2)
ans =
1
>> tic; d3 = sscanf(vertcat(x{:}).','%f'); toc
Elapsed time is 0.024312 seconds.
>> isequal(d0,d3)
ans =
1
>> tic; d4 = sscanf(str2mat(x).','%f'); toc
Elapsed time is 0.011917 seconds.
>> isequal(d0,d4)
ans =
1
:
{{1}}
注意:这些数字是大概的,然后应该在脚本或函数内的多次迭代中运行,但所有代码都会变暖。尝试一下。