Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How to combine cellfun and strfind?

377 views
Skip to first unread message

bluesaturn[at]kellnerweg.de

unread,
Jun 2, 2010, 10:12:29 AM6/2/10
to
Hi there.
I have 1x7 cell array with the contents:

'.' '..' 'H66000.526' 'H66001.526' 'H66002.526' 'H66003.526' 'H66004.526'

How can I combine cellfun and strfind to find '001.' in the other strings, please?

Thank you.

Walter Roberson

unread,
Jun 2, 2010, 12:03:48 PM6/2/10
to
bluesaturn[at]kellnerweg.de wrote:

cellfun(@(IDX) ~isempty(IDX), strfind(TheCell, '.001'))

This will return a logical vector, one per row, true indicating that the
row matched. Is that what you were seeking, or were you looking for
the indices?

Positions = zeros(length(TheCell),1);
T = strfind(TheCell, '.001);
E = cellfun(@isempty, T);
Positions(~E) = cellfun(@(IDX) IDX(1), T(~E));

This will create Positions as 0 for rows that do not contain the string
and as the index of the first occurance of 001. for the rows that do.

us

unread,
Jun 2, 2010, 12:18:04 PM6/2/10
to
"bluesaturn[at]kellnerweg.de" <blues...@kellnerweg.de> wrote in message <842533083.265829.12754...@gallium.mathforum.org>...

one of the many solutions

c={'.','..','ab001','ab002','ac001'};
ix=~cellfun(@isempty,regexp(c,'001'))
% ix = 0 0 1 0 1

us

bluesaturn[at]kellnerweg.de

unread,
Jun 4, 2010, 1:51:56 PM6/4/10
to
Hello!
Yes, I was looking if there is a file containing 001. in the name. So my function gave me back the position and I could collect the name.
With the help of this group I am using now

file_position1=find(~cellfun('isempty', strfind(files_in_folder_names,'000.')));

and by knowing the position I will get the full name later.
Thank you as well for your suggestions.

Emil

unread,
Jul 27, 2010, 3:40:08 AM7/27/10
to
The solution proposed by us
str = '001';

c={'.','..','ab001','ab002','ac001'};
ix=~cellfun(@isempty,regexp(c,str))
I find very elegant. Unfortunately does it only work on char arrays. Can this be modified such that it works for cell arrays of strings as well?

The output then would be a cell array with the same amount of elements as XX. So the statement I am looking for should behave like
str = {'001','b0'};


c={'.','..','ab001','ab002','ac001'};

ix=~cellfun(@isempty,regexp(c,str))

ix{1} = [0 0 1 0 0];
ix{2} = [0 0 1 1 0];

Any ideas?

us

unread,
Jul 27, 2010, 6:05:08 AM7/27/10
to
"Emil " <emi...@gmail.com> wrote in message <i2m2go$ie2$1...@fred.mathworks.com>...

one of the (more contrived) solutions

str={'001','b0'};


c={'.','..','ab001','ab002','ac001'};

ix=arrayfun(@(x) ~cellfun(@isempty,regexp(c,str(x))),1:numel(str),'uni',false);
ix=cat(1,ix{:})
%{
% ix =
0 0 1 0 1


0 0 1 1 0

%}

us

Emil

unread,
Jul 28, 2010, 2:52:06 AM7/28/10
to
Thanks, with the help your post in the other thread I came up with the same solution. It looks really elegant! However, when I compared the performance to that of a for-loop I found

tic
for i = 1:n
for j = 1:numel(id)
ix{j} = ~cellfun(@isempty,regexp(c,str{j}));
end
end
toc

to be 2.5 times faster. I went on to check other examples and found arrayfun to always be slower than the for-loop it is replacing. When is it, performance-wise, an advantage to use arrayfun?

Oleg Komarov

unread,
Jul 28, 2010, 3:41:04 AM7/28/10
to
"Emil " <emi...@gmail.com> wrote in message <i2ok2m$75q$1...@fred.mathworks.com>...

Never.
Only cellfun has 3 syntaxes (the last 3 ones listed in the help) which may be at least as fast as a loop.

Oleg

Matt Fig

unread,
Jul 28, 2010, 11:21:05 AM7/28/10
to
"Emil " <emi...@gmail.com> wrote in message <i2ok2m$75q$1...@fred.mathworks.com>...

> Thanks, with the help your post in the other thread I came up with the same solution. It looks really elegant! However, when I compared the performance to that of a for-loop I found
>
> tic
> for i = 1:n
> for j = 1:numel(id)
> ix{j} = ~cellfun(@isempty,regexp(c,str{j}));
> end
> end
> toc
>


For even more speed use 'isempty' instead of @isempty.

Emil

unread,
Jul 28, 2010, 5:36:06 PM7/28/10
to
Thanks for your inputs. My code works somewhat faster now. So can I conclude that the take-home message here is that for-loops actually are the way to go at times in terms of performance?

Matt Fig

unread,
Jul 28, 2010, 5:48:08 PM7/28/10
to
"Emil " <emi...@gmail.com> wrote in message <i2q7s6$bqo$1...@fred.mathworks.com>...

> Thanks for your inputs. My code works somewhat faster now. So can I conclude that the take-home message here is that for-loops actually are the way to go at times in terms of performance?


... as has been shown many(!) times on this newsgroup.

Bruno Luong

unread,
Jul 29, 2010, 2:25:08 AM7/29/10
to
"Emil " <emi...@gmail.com> wrote in message <i2ok2m$75q$1...@fred.mathworks.com>...

>When is it, performance-wise, an advantage to use arrayfun?

With few exception, arrayfun is cellfun are deceit features introduced by Mathworks few years ago. They are essentially disguised for-loop. Similar topic has been discussed in the pass:

http://www.mathworks.com/matlabcentral/newsreader/view_thread/253815

Bruno

0 new messages