# Find the first element that satisfies a condition on 3D data

3 views (last 30 days)
Elin Jacobs on 24 May 2021
Commented: Elin Jacobs on 25 May 2021
I'm trying to use a logical expression to find the first instance of a condition being met on a 3d matrix.
I have this dummy code for a 1d array that works the way it should:
d = randi([0 50], 100, 1);
dd = sort(d, 'descend');
pa = sum(dd);
dc = cumsum(dd);
%find row where cumsum is 50% of sum
g = find(dc >0.5*pa,1);
However, I can't get it to work on my 3d data of longitude, latitude and time (360,150,365). I want to find the n'th timestep (in the third dimension) where SC is equal to or greater than 1/2 of the sum at each latitude-longitude pair and write that to a new matrix (2d, 360X150). My current attemp is as follows:
prec = ncread(filename_p, 'Prec_gs'); % 360x150x365 matrix
p_annual(:,:) = sum(prec,3,'omitnan'); % 360x150 matrix
S = sort(prec,3,'descend'); % 360x150x365 matrix
SC = cumsum(S,3); % 360x150x365 matrix
N50(:,:) = find(SC(:,:,:) >= 0.5.*p_annual(:,:), 1);
The last row isn't working because the the dimensions are not the same (3d vs 2d), I have tried making p_annual a 3d matrix of same size as SC but still no luck.
Any thoughts on how to solve this?
David Hill on 24 May 2021
An example of your data input and expected output would be helpful.
Elin Jacobs on 25 May 2021
I have attached a sample data file (20x30x365).
filename = 'GLDAS_cropped.nc';
ncid = netcdf.open(filename);
I expect to get a 20x30 matrix with the element (a number between 1 and 365) where SC is equal to or greater than 50% of p_annual. Thanks for your help.

Matt J on 24 May 2021
S = sort(prec,3,'descend'); % 360x150x365 matrix
SC = cumsum(S,3,'omitnan'); % 360x150x365 matrix
p_annual = SC(:,:,end);
[~,N50] = max(SC >= 0.5.*p_annual,[], 3);
Elin Jacobs on 25 May 2021
Yep, that works, thank you so much!
Elin Jacobs on 25 May 2021
To get it right, I needed to put NaN values last when sorting, but otherwise works like a charm!
S = sort(prec,3,'descend','MissingPlacement','Last');