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

Reply via email to