sscanf in a cell array

12 views (last 30 days)
ludvikjahn
ludvikjahn on 26 Feb 2015
Commented: Stephen23 on 30 Jan 2023
good morning, I have a cell array (of strings) and I want to replace strings with corresponding numbers, but using str2double that is incredibly slow. They suggested me to use
sscanf
instead, but I'm not able to use it in a cell array. Any suggestions? Thanks
let's take for instance, [{'0.001'},{'0.34'};{'89'},{'34'};{'0.898'},{'988'}]
and use sscanf
  2 Comments
ludvikjahn
ludvikjahn on 26 Feb 2015
Edited: ludvikjahn on 26 Feb 2015
AH, I want the numbers to be in a matrix of the same dimensions ,no longer in a cell!
Stephen23
Stephen23 on 26 Feb 2015
A neater way to define your cell array is like this:
{'0.001','0.34'; '89','34'; '0.898','988'}
and not by concatenating lots of individual cell arrays.

Sign in to comment.

Answers (2)

Guillaume
Guillaume on 26 Feb 2015
Testing on a 500 x 500 cell array of strings, this is the fastest method I could come up with:
m = reshape(str2num(strjoin(C)), size(C));
This takes about 2.1 seconds on my machine vs 5.4 seconds for the cyclist's answer and 4.7 seconds for Stephen's answer:
>>C = arrayfun(@(n) sprintf('%f', n), rand(500), 'UniformOutput', false);
>>tic; m1 = reshape(str2num(strjoin(C)), size(C)); toc
Elapsed time is 2.081194 seconds.
>>tic; m2 = cellfun(@str2double, C); toc
Elapsed time is 5.396223 seconds.
>>tic; m3 = cellfun(@(s)sscanf(s,'%f'), C); toc
Elapsed time is 4.759057 seconds.
However, you must have obtained that huge cell array by reading some file. Why not read that file as a matrix directly?
  6 Comments
Guillaume
Guillaume on 27 Feb 2015
@ludvikjahn, in R2014b strjoin is happy with matrix, so you must have an earlier version of matlab where it can only deal with vectors. It's easily fixed though:
m = reshape(str2num(strjoin(C(:))), size(C));
On my machine it's still double the speed of Stephen's explicit loop.
As to the fact, that none of matlab built-in import function can't deal with comma as decimal point, I would submit a bug report, because it boggles the mind that that matlab can't deal with localisation properly.
Stephen23
Stephen23 on 30 Jan 2023
Another approach, using a comma-separated list:
C = {'0.001','0.34'; '89','34'; '0.898','988'};
V = sscanf(sprintf(' %s',C{:}),'%f')
V = 6×1
0.0010 89.0000 0.8980 0.3400 34.0000 988.0000

Sign in to comment.


the cyclist
the cyclist on 26 Feb 2015
Are you doing it in parallel, or via loop?
Is this slow?
s = [{'0.001'},{'0.34'};{'89'},{'34'};{'0.898'},{'988'}]
n = cellfun(@str2double,s)
  1 Comment
ludvikjahn
ludvikjahn on 26 Feb 2015
Edited: ludvikjahn on 26 Feb 2015
doing it in parallel, not in a loop... anyway,yes, imagine s as a 10000 x 10000 cell array

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!