Suppose I have a cell
v = \'v\' [576.5818] [3.0286] [576.9270]
\'v\' [576.5953] [3.1180] [576.8716]
\'f\' [ 56] [
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
for fruit = fruits
[fruit{:} 'is a fruit']
end
Magically this already produces the expected 'banana is a fruit', 'apple is a fruit', etc.
A few hints:
for fruit = [fieldnames][1](fruits)'
{:}
is equivalent to cell2mat
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.