Accumarray with tall arrays
5 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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 Kommentare
Akzeptierte Antwort
Edric Ellis
am 16 Mär. 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.
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!