# sscanf with cell array of strings

19 views (last 30 days)

Show older comments

Say I have a cell array:

C = {'2_5_7';'10_2_6';'4_3_7';'3_10_11';'3_16_11'};

To extract one row as a vector of number I was using:

sscanf(C{[2]},'%d_')'

ans =

10 2 6

Now I would like to get several rows (say 2 and 4) in form of a matrix, but this does not work.

sscanf(C{[2 4]},'%d_')'

The desired output for this case should be:

ans =

10 2 6

3 10 11

I would like to avoid the use of a for loop.Any suggestions?

EDIT: The elements of C dont necesarilly contain only 3 number, they can contain 4 or more. ie '3_10_11_5'

##### 2 Comments

Bruno Luong
on 1 Sep 2020

I tell you a secret: For-loop is your true friend, Arrayfun/cellfun are your fake friends.

Bruno Luong
on 1 Sep 2020

### Accepted Answer

Stephen23
on 1 Sep 2020

Edited: Stephen23
on 1 Sep 2020

Probably the most efficient solution:

>> C = {'2_5_7';'10_2_6';'4_3_7';'3_10_11';'3_16_11'};

>> X = [2,4];

>> M = sscanf(sprintf(' %s',C{X}),'%d_%d_%d',[3,Inf]).'

M =

10 2 6

3 10 11

Or a slight simplification (if you are confident about your data):

>> M = sscanf(sprintf('%s_',C{X}),'%d_',[3,Inf]).'

M =

10 2 6

3 10 11

##### 4 Comments

Stephen23
on 1 Sep 2020

Edited: Stephen23
on 1 Sep 2020

"Perhpas if there is a more straight way of doin it."

Yes, the way I showed you.

Using cellfun and cell2mat will be less efficient than what I showed you. Lets try it (1e4 iterations):

Elapsed time is 0.917299 seconds. % my code

Elapsed time is 4.073263 seconds. % your code

### More Answers (1)

Bruno Luong
on 1 Sep 2020

Edited: Bruno Luong
on 1 Sep 2020

>> C = {'2_5_7';'10_2_6';'4_3_7';'3_10_11';'3_16_11_12_20'}

C =

5×1 cell array

{'2_5_7' }

{'10_2_6' }

{'4_3_7' }

{'3_10_11' }

{'3_16_11_12_20'}

>> A = cellfun(@str2num, strrep(C([1,5]),'_',','), 'unif', 0)

A =

2×1 cell array

{1×3 double}

{1×5 double}

>> A{:}

ans =

2 5 7

ans =

3 16 11 12 20

##### 2 Comments

Bruno Luong
on 2 Sep 2020

If they have the same number of elements, e.g.

C = {'2_5_7';'10_2_6';'4_3_7';'3_10_11';'3_16_11_12_20'}

you can do

substring=char(C([1,3]));

substring(substring=='_')=',';

str2num(substring)

% or

str2num(char(strrep(C([1,4]),'_',',')))

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!