That'll work if your families are all adjacent. If they can be shuffled you'll need to do a bit more work.
(But if they are not shuffled, why bother?) Thanks, -- Raul On Mon, Mar 9, 2015 at 12:22 AM, Joe Bogner <[email protected]> wrote: > This seems like it may be a viable solution: > > (1-~ +/\ (~:families)) { famTotal > > On Mon, Mar 9, 2015 at 12:15 AM, Joe Bogner <[email protected]> wrote: > >> I am doing a +//. on a very large array that I need redistribute the >> results back to the original positions. >> >> The dictionary has a solution that works well on small arrays[1], but does >> not work on my large array since it's using = to self classify >> >> Example: >> >> NB. create 3 fake families across 100 rows >> families=: 1,(98$2),3 >> val=: 100 $1 >> >> NB. sum by family >> ] famTotal =: families +//. val >> 1 98 1 >> >> NB. desired output, result distributed to each row >> ] desired =: famTotal ((+/ .*)=) families >> 1 98 98 .... 1 >> >> >> NB. confirms desired matches family total >> (~. ( i.~ families)) { desired >> 4 3 3 >> >> For my very large array: >> >> families=.55e6 $ (i.100000) >> val =: 55e6 $ 1 >> famTotal =: families +//. val >> >> desired =: famTotal ((+/ .*)=) families >> |out of memory >> >> >> The reason why is because = families results in a huge array. >> >> How can I accomplish the same goal efficiently? >> >> >> >> 1 - http://www.jsoftware.com/help/dictionary/d221.htm >> 2 - http://www.jsoftware.com/jwiki/Vocabulary/eq >> > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
