将元胞数组转换为数值数组转换的性能测试

Performance test for converting cell array to numeric array conversion

Cell_in = {'a' '2,34' '3,45' '5,342';
           'b' '3,4' '5,5' '5,2';
           'c' '4' '3,9' '4,3';
           'd' '4,5' '5,7' '6,12';}

Cell_in 只是一个示例,但实际大小为 300000 x 20。数据为德语格式,即 1,23 = 1.23(英语格式)。第一列是参数,从第二列开始到最后是数据。第一步是提取数据,然后我将“,”替换为“。” ,然后转为double进行信号处理

Data_in = cell_in(:,2:end);
Data_in = strrep(Data_in,',','.');
Data_in = str2double(Data_in); % Step 1

然后在处理之后,我通过替换“.”将数据转换回德语格式。用','

% signal Processing...

Data_out = arrayfun(@(x) num2str(x),Data_in,'uni',0); % Step 2
Data_out = strrep(Data_out,',','.');
% Save data to file...

第一步和第二步的执行时间太长。有没有更好的方法来提高性能?

有几件事可以尝试,这取决于您对数据的了解程度。 str2double 的核心使用 sscanf 但进行了大量检查。

如果您的数据很好,那么在第 1 步中创建一个匿名函数,使用 sscanf 一步完成替换和转换以跳过检查。

myStr2num = @(x) sscanf(strrep(x{1},',','.'),'%f'); 
Data_in = arrayfun(myStr2num ,Cell_in(:,2:end));

对于第 2 步,有一个名为 sprintfc 的未记录的函数,它将根据数值数组生成元胞数组,据说速度非常快。

这可能会加快您的第 2 步。

Data_out = sprintfc('%g',Data_in);
Data_out = strrep(Data_out,',','.');