Max and Min values within vectors in a cell matrix

11 views (last 30 days)
Hi everyone. I'm a strong user of MATLAB Answers and I've searched a lot to find an answer to this particular question but I couldn't... I need to find max and min values within vectors that are in a cell matrix. The cell matrix is quite big Nx865x351 where N will not be bigger than 10. Each cell has a vector (1xM, with M variable from vector to vector) or it can be an empty vector (so vectors in the different cells HAVE NOT the same size). So, for each 'N' I want to find the max and min value of all the values in the vectors contained in the 865x351 subpart of the cell matrix. I managed to do it in some way (written below) but I definitevely don't like it, I think there must be a faster and better way. At the end I just want 2 vectors with the max and min values for each N position. In the code
%pos_number=N
%power_critical_all -> cell matrix Nx865x351
min_interf=zeros(1,pos_number);
max_interf=zeros(1,pos_number);
mn = cellfun(@(x) min(x(:)),power_critical_all,'UniformOutput',0);
mx = cellfun(@(x) max(x(:)),power_critical_all,'UniformOutput',0);
% here I replace empty vectors by NaNs because cell2mat doesn't work then if I don't do it
mn(cellfun(@isempty,mn))={NaN};
mx(cellfun(@isempty,mx))={NaN};
mn=cell2mat(mn);
mx=cell2mat(mx);
for i=1:pos_number
min_interf(i)=min(mn(i,:));
max_interf(i)=max(mx(i,:));
end
An annex to this question (not so important but if someone knows how to...): what if I have the case that each vector (not an empty one, obviously) within a cell of the cell matrix has two rows and I just want to get the min and max values from the second row?
I hope I explain myself correctly and thanks in advance for your comments!
  1 Comment
Jan
Jan on 24 Aug 2011
CELLFUN(@isempty) is much slower than CELLFUN('isempty').
All your cell elements are vectors. Then CELLFUN(@min) is about 4 times faster than CELLFUN(@(x) min(x(:)).

Sign in to comment.

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 24 Aug 2011
variant
N = size(C,1);
out = zeros(N,2);
for i1 = 1:N
p1 = [C{i1,:,:}];
out(i1,:) = [min(p1) max(p1)];
end
  8 Comments
Juan Grosso
Juan Grosso on 7 Sep 2011
Dear Andrei or Jan,
I'd like to add a question to this one. I'd need now to be able to get where the min/max value were found, that is in which cell of the 865x351 possible for each N.
I've been trying for a while but no luck...
I'd be grateful if you can give me an advice.
Thanks in advance!
Amalia adiba
Amalia adiba on 16 Jan 2014
Dear Andrei and Juan I have same problem, but in my case, vector is 2xM, cell = {[1:5 6:10],[10:15 16:20],[21:25 26:30]} how to find max and min value for each vector?? and the answer may be like this: max =[5 10 15 20 25 30] min=[1 6 10 16 21 26] thanks in advance and sorry for comment a new question

Sign in to comment.

More Answers (1)

Jan
Jan on 24 Aug 2011
I'm using a C-Mex for finding the Min/Max elements in a set of arrays: FEX: MinMaxElem :
% C is a {Nx865x351} cell.
minValue = zeros(1, N);
maxValue = zeros(1, N); % [EDITED]: was "minValue" a 2nd time
for i = 1:N
[minValue(i), maxValue(i)] = MinMaxElem(C{i, :, :});
end
Getting Min and Max at the same time is much faster than obtaining them separately: For the sequence [1, 2, 3] the first element is the Min and the Max, for the following elements it is enough to check, if it is the new Max - if so, a check for a new Min value can be omitted!
  3 Comments
Jan
Jan on 24 Aug 2011
Please post the error messages, such that we can give an advice.
Using a C-Mex is not hard: Install a C-compiler (I struggled just for 2 days to install MSVC2010+SDK7.1+SP1, 64 bit. Actually it is trivial, but there are bugs in the SP1 installers provided by Microsoft.), run "mex -setup", download the FEX submission, run "mex -O MinMaxElem.c". Or you can download the pre-compiled DLL from my webpage, but this works for 32 bit only at the moment.
Juan Grosso
Juan Grosso on 24 Aug 2011
The error was just because I don't have a compiler installed in this laptop (of my work place) and I cannot install anything here.
Since other persons will use the code I'm doing now, I should follow Andrei's advice which is simpler and doesn't use external files and it's way faster than my code.
Anyway thanks a lot for your help Jan!

Sign in to comment.

Categories

Find more on Operators and Elementary Operations 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!