整数的num2str更快?

时间:2015-11-05 21:24:54

标签: arrays string performance matlab numbers

我有一个名为skj的数组。 skj包含200万行数字(2000000x1 uint32)。

我想计算以下内容

string_skj = num2str(skj);

当我运行上述行时大约需要1分钟,是否有更快的方法呢?

5 个答案:

答案 0 :(得分:5)

Hennadii Madan的答案让我想到是否有一种方法可以比标准的Matlab num2str(或int2str)更有效地为列向量执行此操作,并且我&# 39;提出了2个解决方案。

编辑:在完成所有这些工作之后,@ Luis Mendo进来并将其全部吹出水中:'(

编辑:现在@ Daniel已经改进了所有以前的选项!

给定我们的行向量V,为

V = uint32(randi(100, 200000, 1));

我们可以获得与

相同的结果
A = num2str(V);

带*

B = char(strsplit(num2str(V.')).');

或没有num2str

的错误检查
C = char(strsplit(sprintf('%d\n', V)).');
C = C(1:end-1, :); % Remove extraneous '\n'

BCA略有不同。 num2str预先填充空格' ',而BC填充空格。

以下DE预先填充了0,因此不匹配AB或{完全{1}}。

基准

C

代码

-----num2str() on row vector [Original]-----
Elapsed time is 3.501976 seconds.
  Name           Size              Bytes  Class    Attributes

  A         200000x3             1200000  char               

-----num2str() on column vector [IKavanagh modified from Hennadii Madan]-----
Elapsed time is 0.660878 seconds.
  Name           Size              Bytes  Class    Attributes

  B         200000x3             1200000  char               

-----sprintf() on row vector [IKavanagh]-----
Elapsed time is 0.582472 seconds.
  Name           Size              Bytes  Class    Attributes

  C         200000x3             1200000  char               

-----dec2base() on row vector [Luis Mendo]-----
Elapsed time is 0.042563 seconds.
  Name           Size              Bytes  Class    Attributes

  D         200000x3             1200000  char



-----myfastint2str() on row vector [Daniel]-----
Elapsed time is 0.011894 seconds.
  Name           Size              Bytes  Class    Attributes

  E         200000x3             1200000  char 

答案 1 :(得分:4)

我的机器上的速度要快得多:

y = dec2base(skj,10);

这是一个快速测试:

>> skj = uint32(2^32*rand(1e6,1)); %// random data

>> tic, y = num2str(skj); toc
Elapsed time is 22.823348 seconds.

>> tic, z = dec2base(skj,10); toc
Elapsed time is 1.235942 seconds.

请注意,使用dec2base会提供前导零而不是前导空格。

>> y(1:5,:)
ans =
3864067979
1572155259
1067755677
2492696731
 561648530

>> z(1:5,:)
ans =
3864067979
1572155259
1067755677
2492696731
0561648530

答案 2 :(得分:4)

自己实现int2str,到目前为止,你可以击败原始函数的性能。

function [ o ] = myfastint2str( x )
maxvalue=max(x(:));
%maxvalue=intmax(class(x));%Alternative implementation based on class
required_digits=ceil(log(double(maxvalue+1))/log(10));
o=repmat(x(1)*0,size(x,1),required_digits);%initialize array of required size
for c=size(o,2):-1:1
   o(:,c)=mod(x,10);
   x=(x-o(:,c))/10;
end
o=char(o+'0');
end

对于示例输入,我的函数需要不到0.15秒,而int2strnum2str都需要大约15秒。 输出略有不同,因为它生成前导零而不是空白。

答案 3 :(得分:1)

如果你真的需要提高速度,你考虑过在C中写一个MEx函数扩展吗?它有点复杂,但是如果你有一些可以用C / C ++轻松编码的小程序,那么值得投入时间。编译完成后,可以从MATLAB命令提示符调用MEx函数,就像.m函数一样。

有关详细信息,请参阅http://www.mathworks.com/help/matlab/call-mex-files-1.html

答案 4 :(得分:0)

警告:输出错误,但可能有效。

编辑:超快速“解决方案”输出不是列,而是以换行符作为分隔符的字符串。如果您尝试打印它将看起来相同

>> tic;a = sprintf('%d\n',skj);toc
Elapsed time is 0.422143 seconds

修改:旧'解决方案'

尝试前后移调。与num2str(skj.').'

一样
>> skj = ones(2000000,1,'uint32');
>> tic;num2str(skj);toc
Elapsed time is 23.305860 seconds.
>> tic;num2str(skj.');toc
Elapsed time is 1.044551 seconds.