这篇文章是关于测试以下问题的解决方案的性能:
S给出了格式为由下划线分隔的数字的字符串的单元格数组,例如:
list_of_words = repmat({'02_04_04_52_23_14_54_672_0'},10,1);保证所有字符串:
- 它们只包含十进制数字和下划线;
- 下划线的数量是相同的;
- 没有两个连续的下划线.
编写MATLAB代码,将字符串的单元格数组转换为数字矩阵
S×M双精度数(值小1000倍),其中S是字符串M数,是字符串中的数字数.
StackOverflow上发布了一个非常类似的问题,提出了几个解决方案.最初的目标是提高速度性能.
为速度而设计的两个解决方案似乎从一个MATLAB安装到另一个,甚至从一个运行到另一个运行的性能差异很大.此外,它们具有非常不同的实现样式.
在黑暗的角落,你会发现一个违背 MATLAB最神圣的原则的解决方案:eval是邪恶的,应该不惜一切代价避免循环.但是,代码尝试通过避免重复的内存分配,使用快速将字符串转换为数字以及执行就地操作来优化速度:
%'eval_and_loops_solution.m'
function array_of_numbers = eval_and_loops_solution(list_of_words)
n_numbers = 1 + sum(list_of_words{1}=='_');
n_words = numel(list_of_words);
array_of_numbers = zeros(n_numbers, n_words);
for k = 1:n_words
temp = ['[', list_of_words{k}, ']'];
temp(temp=='_') = ';';
array_of_numbers(:,k) = eval(temp);
end;
%'this is a waste of memory, but is kind of required'
array_of_numbers = transpose(array_of_numbers / …Run Code Online (Sandbox Code Playgroud)