# Accumarray help: extracting matrix min/max based on values in first column.

11 views (last 30 days)
Evan Watts on 24 Apr 2018
Commented: Evan Watts on 25 Apr 2018
I have a matrix of 44222x4 with columns of date, time, flow, and pH respectively. I was trying to use accumarray to sort the min and max pH values for each date. My code is C=accumarray(matrix(:,1),(matrix(:,4),[],@(n){n}).
One of the large problems I have is with accumarray not accepting my matrix(:,4) as a numeric vector. Error text: "Second input VAL must be a full numeric, logical, or char vector or scalar."

Razvan Carbunescu on 25 Apr 2018
For this case the type of the data is probably what is giving you the problem.
In R2018a you can use groupsummary to get these results, if you put the data into a table:
T = array2table(matrix,'VariableNames',{'date', 'time', 'flow', 'pH'});
GT = groupsummary(T,'date',{'min', 'max'},'pH');
If using an earlier release can probably use findgroups / splitapply for the workflow:
[idx,dates] = findgroups(matrix(:,1));
min_pH = splitapply(@min,matrix(:,4),idx);
max_pH = splitapply(@max,matrix(:,4),idx);

Stephen on 24 Apr 2018
Why not just calculate the min/max directly using accumarray?:
[~,~,idx] = unique(matrix(:,1));
accumarray(idx,matrix(:,4),[],@min)
accumarray(idx,matrix(:,4),[],@max)
Evan Watts on 25 Apr 2018
Thanks! I with both of the answers here I was able to get it to work.