是一种快速将长单元字符数据转换为数字矩阵的方法?

时间:2016-09-21 03:18:44

标签: matlab

以下是描述我的问题的示例代码。

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长度的实际长度非常大,完成转换需要更长的时间。有没有办法让它更快?

1 个答案:

答案 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)).';

另一种选择是使用cellfunnum2str将单元格数组的每个条目转换为数字,然后沿第一维连接结果。

values = cellfun(@num2str, ff, 'UniformOutput', false);
YY = cat(1, values{:});

第一个选项大约快两倍,因为你只调用num2str一次,而存储由strjoin创建的临时字符串所需的内存将小于存储它所需的空间数据作为数值数据类型(double)。