使用cellfun将带参数的函数应用于单元格

时间:2014-02-15 01:38:54

标签: matlab

假设有一个字符数组,希望将其转换为数字向量。这可以使用str2numstr2double来完成。例如,

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应用任何需要有序系列参数的函数?

2 个答案:

答案 0 :(得分:2)

sscanf的包装器怎么样?

myWrapper = @(x) sscanf(x, '%f')
x={'0.17106'; '2.11462'; '4.13938'; '6.24203'}
cellfun(myWrapper,x)
str2double(x)

答案 1 :(得分:2)

要快速执行此操作,请勿使用cellfunstr2double。一些可能性:

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}}

注意:这些数字是大概的,然后应该在脚本或函数内的多次迭代中运行,但所有代码都会变暖。尝试一下。