Scalar max of cell array with structure

3 views (last 30 days)
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 Comments
Michael Bowles
Michael Bowles on 4 May 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.

Sign in to comment.

Accepted Answer

James Tursa
James Tursa on 4 May 2020
If you reshape the input first, a one-liner version of your code:
peak = max(cellfun(@(x) max(abs(x.noise(:))),myCell(:)));
  3 Comments
James Tursa
James Tursa on 4 May 2020
Edited: James Tursa on 4 May 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 on 4 May 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!

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!