Scalar max of cell array with structure

3 visualizaciones (últimos 30 días)
Michael Bowles
Michael Bowles el 4 de Mayo de 2020
Comentada: Michael Bowles el 4 de Mayo de 2020
I have a cell array "myCell" with 2 dimensions and each cell has a 2D matrix and I'd like to obtain scalar value of the maximum for a given structure among all the cell dimensions. I assume bsxfun can do this but my goal doesn't match they way that I normally see bsxfun get used.
Currently I get the max (of the abs) looping through each cell dimension, grabbing the max for all elements in that cell's structure I need, assign the (scalar) max to elements in a matirx which shares the cell array dimensions, then tak the max of the matrix with (:) as shown below.
peak_FcRn(noFc,noRa)=0; % each cell array has structure, whose maxes I want to compare
for iFc=1:noFc
for iRa=1:noRa
% get the maximum absolute value of the current cell array's structure
% called noise (myCell{iRa,iFc}.noise--2 or 3d array)
peak_FcRn(iFc,iRa) = max(abs(myCell{iRa,iFc}.noise(:))); % a scalar value
end
end
% the
peak = max(peak_FcRn(:)); %
This gets the right answer but I would really like a one- or two-liner that can get the max of the cell's structure elements--and I have a feeling bsxfun can do it!
In the laziest way I would type
peak = max(abs(myCell{:,:}.noise(:))) % or perhaps
peak = max(abs(myCell{:}.noise(:)))
Thanks for your input,
Michael B.
  2 comentarios
darova
darova el 4 de Mayo de 2020
Try cellfun
Michael Bowles
Michael Bowles el 4 de Mayo de 2020
Thanks for your input. I got it to work with a cute two-liner!
peakPerCELL = cellfun(@(x) max(abs(x.noise(:))),myCell);
peak = max(peakPerPADS(:));
Cheers!
Michael B.

Iniciar sesión para comentar.

Respuesta aceptada

James Tursa
James Tursa el 4 de Mayo de 2020
If you reshape the input first, a one-liner version of your code:
peak = max(cellfun(@(x) max(abs(x.noise(:))),myCell(:)));
  3 comentarios
James Tursa
James Tursa el 4 de Mayo de 2020
Editada: James Tursa el 4 de Mayo de 2020
The myCell(:) reshapes myCell into a column vector and passes that into cellfun( ), which in turn creates the output with the same shape as the input ... a column vector. Since the output is now already a column vector, no need to reshape it again before taking max( ).
Michael Bowles
Michael Bowles el 4 de Mayo de 2020
I understand and realize my question is silly now! I confused my self before posting my second question because I thought I hadn't changed the last cellfun input with (:).
Thanks for your help! I learned great stuff today!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Matrix Indexing 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