MATLAB: Get n-th value from a double array in a cell array

cell arrayscellfunindexingMATLAB

Hi all,
i've a 200*200 cell array (test) with a n*1 double array in each, some cells are empty as well. I want to get the 5th value of the double (5,1).
1) Generate Index with only non-empty elements:
fct = @(d) find(d > 0, 1, 'first');
IndUpdates = cellfun(fct, test, 'Uni', 0);
2) Get size of Double Arrays
fct2 = @(idx, d) size(d,1);
IndSize = cellfun(fct2, IndUpdates, test, 'Uni', 0);
--> what is the 'idx' for? it does not run without it
3) Generate Index for cells with double arrays bigger than 5 elements
fct3 = @(d) find(d > MinUpdates, 1, 'first');
idxsus = cellfun(fct3, IndUpdates, test, 'Uni', 0);
until here it works fine. now i want the 5th value from every double array indexed by "idxsus". I thougt it would work like below, but it doesn't. (Error: Too many input arguments)
fct4 = @(d) d(MinUpdates,1);
result = cellfun(fct4, idxsus, test, 'Uni', 0);
I'm no matlab expert (as you can see) – is there anyone, who can fix my code with a little explanation?
Thank you in advance!
Florian

Best Answer

Why do you get the indices of non-empty cells, if you check again, if the length is greater than MinUpdates? The latter is sufficient. But it is not clear, why you assume that:
@(d) find(d > 0, 1, 'first')
finds empty cell elements. It checks for elements, which are greater than 0.
fct2 = @(idx, d) size(d,1);
IndSize = cellfun(fct2, IndUpdates, test, 'Uni', 0);
--> what is the 'idx' for? it does not run without it
You provide two inputs to cellfun: IndUpdates and test. Then cellfun calls the anonymous function with two arguments also. But why do you provide IndUpdates here?
What is the meaning and values of MinUpdates?
It is hard to understand the purpose of the code. What about a simple loop?
result = cell(size(test));
want = 5;
for k = 1:numel(test)
x = test{k};
if numel(x) >= want
result{k} = x(want);
end
end
If you really like cellfun:
want = 5;
match = cellfun('prodofsize', test) >= want;
result = cell(size(test));
result(match) = cellfun(@(c) c(want), test(match), 'UniformOutput', false)
Note: The "old" style cellfun('prodofsize', test) is more efficient than using an anonymous function or function handle like:
cellfun(@(c) numel(c), test)
cellfun(@numel, test)