Accumarray with tall arrays
6 views (last 30 days)
Show older comments
Accumarray is not in the list of functions that support tall arrays. Is there a way to do what it does with tall arrays?
For example, suppose I have a tall array of dates tt.DATE and a tall array of corresponding values tt.VAL. How can I sum tt.VAL for each unique date in tt.DATE?
uniqDate = gather(unique(tt.DATE);
sumVal = zeros(length(uniqDate),1);
for i = 1:length(uniqDate)
thisInd = tt.DATE == uniqDate(i);
thisSum = gather(tt.VAL(thisInd));
sumVal(i, 1) = thisSum;
end
This approach works except that it requires a call to gather at each step so it is far too slow. If I could write the gather statement outside of the loop somehow, I imagine that would help, but I can't figure out how to do it.
0 Comments
Accepted Answer
Edric Ellis
on 16 Mar 2017
% Make some example data
tt = tall(table(datetime(2017, 03, randi([1 31], 100, 1)), ...
rand(100, 1), 'VariableNames', {'Date', 'Value'}));
% group by date
g = findgroups(tt.Date);
% Call splitapply to find the sum of values on each unique date
sumAndDate = splitapply(@(v, d) {sum(v), d(1)}, tt.Value, tt.Date, g)
Note that because findgroups for tall arrays doesn't support the second output argument, I've concocted a slightly unusual function for the splitapply stage which returns both the sum and the datetime corresponding to that group.
More Answers (0)
See Also
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!