Scalar max of cell array with structure

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

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

If you reshape the input first, a one-liner version of your code:
peak = max(cellfun(@(x) max(abs(x.noise(:))),myCell(:)));

3 Comments

Thanks that's even neater! Can you explain why taking the max outside cellfun ignores the dimensions (i.e. doesn't need an associated "(:)"? I realize I could use
peak = max(cellfun(@(x) max(abs(x.noise(:))),myCell(1,:)));
to grab along a chosen dimension, but why is the default to treat the output of cellfun (a whos tells me it's a double) like a 1D vector?
Thanks!
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( ).
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)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!