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

2 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?
##### 2 CommentsShowHide 1 older comment
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
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');