将元胞数组转换为数值数组转换的性能测试
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,',','.');
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,',','.');