Borrar filtros
Borrar filtros

How to do operations on nested cell array?

5 visualizaciones (últimos 30 días)
maruljay
maruljay el 15 de En. de 2020
Comentada: Walter Roberson el 17 de En. de 2020
I have a nested cell array named 'events'.Each cell contains either 1 or more than 1 cells which in turn contains time series.
I want to write a code where, if the cell contains more than 1 cell arrays of time series, I want to find the standard deviation of each of those time series and retain only the time series with the highest standard deviation.
For ex: For the case of events {6,1} which contains 3 time series, I want to find the std of events{6,1}{1,1}, events{6,1}{2,1} and events{6,1}{3,1} and only retain the time series with the highest std and delete the rest.
How can I do this?
Thanks
events.PNG event_2.PNG event_3.PNG

Respuestas (2)

Walter Roberson
Walter Roberson el 16 de En. de 2020
Editada: Walter Roberson el 16 de En. de 2020
for K = 1 : numel(events)
[~, idx] = max(cellfun(@std, events{K}));
Events{K} = events{K}(idx);
end
I would not bother trying to do it without a loop. It is possible, yes, but avoiding the loop requires calculating the std twice because inside the loop it is not possible to get at the second output of max()
  1 comentario
maruljay
maruljay el 16 de En. de 2020
I get the error:
Error using cellfun
Input #2 expected to be a cell array, was double instead.

Iniciar sesión para comentar.


Turlough Hughes
Turlough Hughes el 16 de En. de 2020
Editada: Turlough Hughes el 16 de En. de 2020
This should hopefully work but i ament able to test it myself right now as I'm away from my computer. The idea is to pass onecell at a time from the first level through a subfunction called myfun. myfun subsequently uses cellfun again to check each subcell, it finds the one with max standard deviation and should return that one.
EventsStdMax = cellfun(@(x) myfun(x),events,'UniformOutput',false)
function out = myfun(onecell)
[~,idx] = max(cellfun(@(x) std(x), onecell));
out = onecell{idx};
end
Edit: As Walter pointed out.
  6 comentarios
maruljay
maruljay el 17 de En. de 2020
Or is it because the time series is stored as a double like the screenshot shows 1x4217 double?
Walter Roberson
Walter Roberson el 17 de En. de 2020
No, according to your images , the first 27 entries in events are not timeseries and are instead cell arrays containing timeseries. But somewhere in events you have an entry which is not a cell array.
cellfun(@class, events, 'uniform', 0)
and look for one that does not say 'cell'

Iniciar sesión para comentar.

Categorías

Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by