我可以以某种方式提高str2double的性能吗?
63次观看(最近30天)
显示较旧的评论
您好,在我转换大量字符串时,是否有其他方法可以通过使用STR2Double以外的其他方法来提高性能?我的整个功能需要将近15秒钟才能转换这些字符串。它极大地影响了我的脚本。
过去时间为7.239212秒。
过去时间为6.984212秒。
接受的答案
更多答案(1)
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
结尾
结尾
结尾
结尾
结尾