Is there a better way to use cellfun with arguments? and is it better than for-loop?

1 view (last 30 days)
ytzhak goussha
ytzhak goussha on 8 Sep 2021
Commented: ytzhak goussha on 9 Sep 2021
When I use cellfun, with a function that has arguments, I use repmat function to duplicate my arguments. My question is, if there is a better way to do this.
Here is an example
Lets say that I have a cell array of matricies and I want to get the size of dimention 1 in each
%Create a cell array with random values
randVal = @(x) magic(randi(5,2))
cellArr = arrayfun(randVal, ones(10,1),'uniformOutput',false);
%Get the size of the first dimention of each element in the cell aray
sizes = cellfun(@size,cellArr,repmat({1},size(cellArr,1),1));
This is the part that I am asking about:
Is there a better way to do this?
And in general, is this better that using a for-loop ?
ytzhak goussha
ytzhak goussha on 9 Sep 2021
I stand corrected. You are right!
You were right @Rikk, @Steven Lord' s post was right on the mark and I just didn't understand it.
I removed my comment.
Again, thank you all

Sign in to comment.

Accepted Answer

Jan on 8 Sep 2021
Edited: Jan on 8 Sep 2021
sizes = cellfun('size', cellArr, 1);
Using the CHAR vector arguments is mentioned in the documentation as "backward compatibility". This calling style is the only one, in which cellfun is faster than a simple loop.
Jan on 8 Sep 2021
Rik's argument is important: If the cell contains e.g. strings, the 'size' command (as char vector) will fail.
I prefer loops. cellfun, arrayfun, structfun allow very compact code. But usually they are harder to read and to maintain. I like fast code also, but I've seen to many projects failing due to a too complex design which impedes the debugging. Therefore is prefer dull loops. The KISS style...

Sign in to comment.

More Answers (1)

Steven Lord
Steven Lord on 8 Sep 2021
A = {1:10, magic(5), @sin}
A = 1×3 cell array
{[1 2 3 4 5 6 7 8 9 10]} {5×5 double} {@sin}
cellfun(@(x) size(x, 1), A)
ans = 1×3
1 5 1




Community Treasure Hunt

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

Start Hunting!