我有一个名为skj
的数组。 skj
包含200万行数字(2000000x1
uint32
)。
我想计算以下内容
string_skj = num2str(skj);
当我运行上述行时大约需要1分钟,是否有更快的方法呢?
答案 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'
B
和C
与A
略有不同。 num2str
预先填充空格' '
,而B
和C
填充空格。
以下D
和E
预先填充了0
,因此不匹配A
,B
或{完全{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秒,而int2str
和num2str
都需要大约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.