# how to convert a cell to string in matlab

Suppose I have a cell

v = 'v' [576.5818] [3.0286] [576.9270] 'v' [576.5953] [3.1180] [576.8716] 'f' [ 56] [ 58] [ 52] 'f' [ 56] [ 58] [ 52]

and I want to convert this to a cell array using a format string for each element:' %.5f'

How can I do this? I tried the following approach, but I get an error:

f1 = @(x) sprintf(' %.5f',x); cellfun(f1, num2cell(v),'UniformOutput', false)

I am getting an error as ???

Error using ==> sprintf

Function is not defined for 'cell' inputs.

Error in ==> @(x)sprintf(' %.5f',x)

Can any one help me thanks in advance

## Answers

# String is a cell array

Well, not really.. It is a matrix, but continue reading.

I guess cell array is the most mystic data type in MATLAB. So let's **demystify** it a bit ;-)

Assume

fruits = {... 'banana',... 'apple',... 'orange'... }

First of all integer indexing is not needed for small arrays. It is much better to use **foreach**-like constructions. Indeed,

for index = 1:numel(fruits) fruits{index} end

is equivalent to

for fruit = fruits fruit end

right?

Well, not quite. First loop produces strings, while the second one gives cells. You can check it with

for index = 1:numel(fruits) [isstr(fruits{index}) iscell(fruits{index})] end for fruit = fruits [isstr(fruit) iscell(fruit)] end

, i.e. **[1 0]** and **[0 1]**.

If you have spot the difference, then you must know what to do with the next example (in this one is really relate to your question **(!)** I promise!). Say you try to do horizontal concatenation in a loop:

for fruit = fruits [fruit 'is a fruit'] end

You will get

ans = 'banana' 'is a fruit'

and so on. Why? Apparently this code tries to concatenate a nested cell array to a string (a cell array containing a matrix of chars which constitute the string like 'banana'). So, correct answer is

# Use {:}

for fruit = fruits [fruit{:} 'is a fruit'] end

Magically this already produces the expected *'banana is a fruit'*, *'apple is a fruit'*, etc.

# Hints

A few hints:

- Index-free looping works nicely with structs as in for fruit = [fieldnames][1](fruits)'
- The above is
*true*for open source**octave** - banana is not just fruit, taxonomically it is also a herb ;-) just like 'banana' in MATLAB is both a string and a matrix, i.e. assert(isstr('banana') && ismat('banana')) passes, but assert(iscell('banana')) fails.
- {:} is equivalent to cell2mat

# PS

a solution to your question may look like this:

Given

vcell = {... 'v' 576.5818 3.0286 576.9270; 'v' 576.5818 3.0286 576.9270 }

covert index-wise only numeric types to strings

vcell(cellfun(@isnumeric, vcell)) = cellfun(@(x) sprintf('%.5f', x), vcell(cellfun(@isnumeric, vcell)), 'UniformOutput', false)

Above code outputs

vcell =

'v' '576.58180' '3.02860' '576.92700' 'v' '576.58180' '3.02860' '576.92700'

which can be concatenated.

Suppose we have a cell as follows:

my_cell = {'Hello World'} class(my_cell) ans = cell

We can get the string out of it simply by using the {:} operator on it directly.

class(my_cell{:}) ans = char

Note that we can use the expression mycell{:} anywhere we would use a normal string.

Try this:

sprintf(' %.5f',x{:})

(Works according to some Google results.)

By looking in the strjoin.m file i found this:

string = [x{:}];