loop-less way to str2double a portion of a cell array in place?
2 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Sean de Wolski
2012-10-24
isnan(cellfun(@str2double,your_cell));
4 个评论
Sean de Wolski
2012-10-24
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
2012-10-24
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,...)
更多回答(2 个)
Matt J
2012-10-24
编辑:Matt J
2012-10-24
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 个评论
Matt J
2012-10-24
编辑:Matt J
2012-10-24
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
2015-12-17
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".
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!