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

Reply via email to