loop-less way to str2double a portion of a cell array in place?
    21 views (last 30 days)
  
       Show older comments
    
    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
0 Comments
Accepted Answer
  Sean de Wolski
      
      
 on 24 Oct 2012
        isnan(cellfun(@str2double,your_cell));
4 Comments
  Sean de Wolski
      
      
 on 24 Oct 2012
				I was pointing you in the right general direction, not giving you complete code. Also, the question is formatted as a wall of text which is kind of hard to follow.
your_cell = {'0','hello','1'};
attempt = cellfun(@str2double,your_cell);
idx = ~isnan(attempt);
your_cell(idx) = num2cell(attempt(idx))
  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,...)
More Answers (2)
  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.
4 Comments
  Matt J
      
      
 on 24 Oct 2012
				
      Edited: Matt J
      
      
 on 24 Oct 2012
  
			No, I didn't say anything about the cell elements being large. I meant that if numel(thecellarray) is really large it means you've stored a lot of data discontiguously in memory. No manipulation you do with such an array can be fast, with for-loops or otherwise. So, when speed is your priority and the data is large, you just don't use cells.
  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".
See Also
Categories
				Find more on Cell Arrays in Help Center and File Exchange
			
	Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


