# loop-less way to str2double a portion of a cell array in place?

7 views (last 30 days)
David Goldsmith on 24 Oct 2012
Commented: Colin Edgar on 17 Dec 2015
Hi! I feel like I shouldn't need to ask this by now, but everyway I try doesn't work: I have a cellstr array, some elements of which are character representations of numbers, e.g., A = {'0', 'hello', '2'}; I want to convert this to A = {0, 'hello', 2}. I've tried dozens of variations of: A(~isnan(str2double(A))) = str2double(A(~isnan(str2double(A)))) (I actually have a separate indexing arry, I'm just using isnan for illustrative purposes, but it does extract the sub-array I want to convert) involving {} instead of () in various places, cellfun, arrayfun, deal, mat2cell, cell2mat, etc., and everything either returns an error or assigns the whole target sub-array to every target array element, i.e., I get A = {{0,2}, 'hello', {0,2}}. Is there a loop-less way to convert {'0', 'hello', '2'} to {0, 'hello', 2}? Thanks!
DG

Sean de Wolski on 24 Oct 2012
isnan(cellfun(@str2double,your_cell));
Sean de Wolski on 24 Oct 2012
Of course, if I had to do this I would probably just write a function
function x = foo(x)
y = str2double(x)
if ~isnan(y)
x = y;
end
And then:
cellfun(@foo,...)

Matt J on 24 Oct 2012
Edited: Matt J on 24 Oct 2012
In general, there is no loop-less way to manipulate cell arrays at all.
cellfun, arrayfun, mat2cell, cell2mat,etc... all use loops internally.
It shouldn't matter. If you're using cells big enough for for-loop speed to matter, you're probably not using cell arrays as they're intended.
Colin Edgar on 17 Dec 2015
So I apparently am not using cell arrays correctly. Am using the approach:
mat = cell2mat(cellfun(@str2double,your_cell));
to create 'mat' which is 13x18000, there is a bunch of code predicated on having this array. It works fine for a few files, but now I'm opening thousands of files and it is very slow (~20sec each file).
I've tried to use fscanf but cannot seem to get the array correctly formated. The input files are comma delimited, with a 4 line header and the initial column a timestamp eg "yyyy-mm-dd etc".

David Goldsmith on 24 Oct 2012
Thanks, Matt, your example works. In my case, I needed more than simply being "pointed in the right direction": as I said in the OP, I had no trouble extracting the indices of the elements to convert (nor actually converting those elements); it was the "end game" of assigning the results of this extraction and conversion to their original locations in the original cell array that was eluding me. So thanks for providing a consise, complete solution.

### Community Treasure Hunt

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

Start Hunting!

Translated by