以下是描述我的问题的示例代码。
ff= [{'1 2 3 4 5'};{'2 2 3 4 2'};{'3 2 3 4 3'};{'4 2 3 4 4'}];
YY=[];
for i=1:length(ff)
xx=str2num(ff{i,1});
YY=[YY;xx];
end
类似于示例代码,我的ff长度的实际长度非常大,完成转换需要更长的时间。有没有办法让它更快?
答案 0 :(得分:2)
由于每次通过for循环不断扩展YY
的大小,因此您的解决方案会变得特别慢。
要优化此功能,您可以先使用strjoin
将字符串的单元格数组转换为一个长字符串。然后,您可以立即将str2num
应用于整个字符串并重新整形结果。
YY = reshape(str2num(strjoin(ff)), [], numel(ff)).'
% 1 2 3 4 5
% 2 2 3 4 2
% 3 2 3 4 3
% 4 2 3 4 4
如果您的MATLAB版本没有strjoin
,您可以随时将其替换为sprintf
YY = reshape(str2num(sprintf('%s ', ff{:})), [], numel(ff)).';
另一种选择是使用cellfun
和num2str
将单元格数组的每个条目转换为数字,然后沿第一维连接结果。
values = cellfun(@num2str, ff, 'UniformOutput', false);
YY = cat(1, values{:});
第一个选项大约快两倍,因为你只调用num2str
一次,而存储由strjoin
创建的临时字符串所需的内存将小于存储它所需的空间数据作为数值数据类型(double
)。