Effacer les filtres
Effacer les filtres

Why does str2num take much longer to convert 1001 long char array apposed to a 1000 long char array (MatLab R2010b 64bit, on Win 64bit)

2 vues (au cours des 30 derniers jours)
%make 1001-by-3 char array of numbers, can replace 3 with any size
t = '0123456789';
t = t(ceil(rand(3,1001)*10))';
%big difference in time needed to convert 1000 vs 1001 numbers
tic,n1000 = str2num(t(1:1000,:));toc
tic,n1001 = str2num(t(1:1001,:));toc
% Elapsed time is 0.000285 seconds.
% Elapsed time is 0.011493 seconds.
%results are identical
all(n1000 == n1001(1:1000))
%ans =
% 1
  1 commentaire
Serge le 11 Mar 2023
It's now 2023 and the performance step change of str2num is still there but now in a different place...
str2num is still 4x faster then str2double in this situation.
(R2022b, Win10)
str1 = num2str(rand(15384,1)); %list of numbers as char, 15384-by-10
str2 = num2str(rand(15385,1)); %list of numbers as char, 15385-by-10
timeit(@()str2num(str1)) %0.002 sec FAST
timeit(@()str2num(str2)) %0.046 sec 20x slower
timeit(@()str2double(str1)) %0.009 sec 4x slower
timeit(@()str2double(str2)) %0.009 sec 4x slower

Connectez-vous pour commenter.

Réponses (2)

Walter Roberson
Walter Roberson le 1 Juin 2016
You should use timeit() from the File Exchange to get more accurate timing. (timeit was eventually made part of MATLAB.)
I do see more of a difference than I would expect in R2016a on OS-X.
I recommend you switch to str2double()
  2 commentaires
Serge le 2 Juin 2016
str2double is much slower then str2num for a char array and speed is an important aspect of this question.
t1001 = num2str(rand(1001,1)); t1000 = t1001(1:1000,:);
c1001 = cellstr(t1001); c1000 = cellstr(t1000);
f = @()str2num(t1000); t1 = timeit(f)
f = @()str2num(t1001); t2 = timeit(f)
f = @()str2double(cellstr(t1000)); t3 = timeit(f)
f = @()str2double(cellstr(t1001)); t4 = timeit(f)
f = @()str2double(c1000); t5 = timeit(f)
f = @()str2double(c1001); t6 = timeit(f)
t1 = 0.00054 %FASTEST!
t2 = 0.0119 %
t3 = 0.0208
t4 = 0.0213
t5 = 0.0190
t6 = 0.0187
This means that the fastest way to read a regularly formatted file is to read it in chunks, convert text to an array, then use str2num, but making sure that the initial chunk does not read in more then 1000 lines. Even faster then fscanf.
Walter Roberson
Walter Roberson le 2 Juin 2016
f = @() str2double(t1000); t7 = timeit(f)
f = @() str2double(t1001); t8 = timeit(f)
On my system it is not as fast as t1 or t2 but it is faster than any of the others.

Connectez-vous pour commenter.

Steven Lord
Steven Lord le 11 Mar 2023
What's your ultimate goal here, of which I suspect this conversion is one step in a larger process?
If you want to generate 1000 (or 1001) 3-digit numbers I wouldn't work with char arrays at all. Just create the data as numbers in the first place.
x = randi([100 999], 1001, 1);
Elapsed time is 0.003874 seconds.
If you're trying to convert data that you read in from a file as text into numbers, why not read that data in as numbers in the first place? If you're using functions like readtable or readmatrix set the import options created by detectImportOptions to read the data in using a numeric data type.
If you're trying to do something else and you can explain that task in more detail we may be able to offer more specific suggestions.


En savoir plus sur Data Type Conversion dans Help Center et File Exchange


Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by