我可以以某种方式提高str2double的性能吗?

63次观看(最近30天)
Michau709
Michau709 2021年1月22日
您好,在我转换大量字符串时,是否有其他方法可以通过使用STR2Double以外的其他方法来提高性能?我的整个功能需要将近15秒钟才能转换这些字符串。它极大地影响了我的脚本。
过去时间为7.239212秒。
过去时间为6.984212秒。
2条评论
Michau709
Michau709 2021年1月22日
很抱歉没有指定。我正在尝试转换约1000 000个字符串。

登录发表评论。

接受的答案

Stephen23
Stephen23 2021年1月22日
编辑:Stephen23 2021年1月22日
最快的转换使用低级命令,例如 Sprintf SSCANF 。而不是这个:
C = {'1.2',,,,'3.4',,,,'5.6'};
v = str2double(c)
V = 1×3
1.2000 3.4000 5.6000
这样做(添加 重塑 如果需要,或指定可选大小参数):
v = sscanf(sprintf(sprintf)('%s',C{:}),'%F',[1,inf])
V = 1×3
1.2000 3.4000 5.6000
也可以看看:

更多答案(1)

Yair Altman
Yair Altman 2021年2月9日
我使用以下函数将字符串的单元格阵列转换为数字值的单元格(如果适用) - 根据特定输入(YMMV),它比str2double或sscanf快〜2-5x。对于直至10^15-1的正整数来说,它是最快的,对于双打,与SSCANF相同的速度仍然很快,用于所有其他输入。请注意,在输入单元格中,字符串保持不变。
功能结果= strs2number(细胞器)
数字= numel(celltrs);
结果= Celltrs;%预分配
powersof10 = [100000000000 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000。...
1000000000 1000000000000000000000000000000000000000000001000 100 10 1];
nmax = 14;%=长度(powersof10);
%结果(CellFun('Isempty',结果))= {[]};%循环下面的速度更快
为了idx = 1:数字
值= celltrs {idx};
n =长度(value);
如果n == 0
结果{idx} = [];%''=> []
继续
Elseif值(1)>'9'%跳过最明显的非数字字符串
继续
Elseifn> nmax%例如'20210209 08:35:40'
继续
结尾
%结果{idx} = str2number(value);下面分配的%以供性能
isDigit = value> ='0'&value <='9';
如果所有(iSdigit)%简单的正整数
powers = powersof10(nmax-n+1:nmax);百分比比10(end-n+1:end)或10。^(n-1:-1:0)快。
结果{idx} = sum((值 -'0')。*权力);
别的
isdot = value =='。';
如果所有(isDigit | isdot)%&& n <= nmax%简单的正fp编号
dotidx = find(isdot);
如果numel(dotidx)> 1,继续,,,,结尾%忽略IP地址:'12 .34.56.78'
n = n -1;
shift = dotidx -n -1;
因子= 10^shift;
n1 = nmax-n;n2 = n1+dotidx;
powers = [powersof10(n1+1:n2-1),0,powersof10(n2:nmax)];
numericVal = sum((值 -'0')。 * powers) *因素;
结果{idx} = numericVal;
Elseif任何(值=='')||任何(值=='/')||任何(值>'9')||sum(值==' - ')> 1 ||sum(isdot)> 1%||值(1)>'9'%非数字字符串(我们假设诸如'1.23e-5'之类的fp值永远不会发生)
%结果{idx} = value;%不必要:已经预先分配了这种方式
别的%负数等百分比
[numericVal,count,errmsg,nextExex] = sscanf(value,'%F',1);%*比str2double快得多!
如果count == 1 && isempty(errmsg)&& nextIndex> n
结果{idx} = numericVal;
别的
%结果{idx} = value;%不必要:将结果初始化为细胞TRSTR
结尾
结尾
结尾
结尾
结尾
2条评论

登录发表评论。

下载188bet金宝搏


发布

R2020a

社区寻宝

在Matlab Central中找到宝藏,发现社区如何为您提供帮助!

开始狩猎!