Accumarray with tall arrays
5 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Greg
el 15 de Mzo. de 2017
Comentada: Greg
el 16 de Mzo. de 2017
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 comentarios
Respuesta aceptada
Edric Ellis
el 16 de Mzo. de 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.
Más respuestas (0)
Ver también
Categorías
Más información sobre Loops and Conditional Statements en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!