Sorry Rick, too quick in copy/paste (no check) ... Correction ...
So looped result is now done under 'each' with a simple restructure of your
index and contents as...(scatind1,<contents1);(scatind2,<contents2) etc
((<"1 each idx) ,each <"0 contents) box_amend each m
+--------+----------+
| 0 46 99|46 0 0 0|
| 0 0 0| 0 0 0 99|
| 0 0 0| 0 0 0 0|
|23 0 62| 0 0 0 0|
|42 0 0| 0 0 23 62|
|44 12 0| |
+--------+----------+
(I had overlooked tidx assignment in my reply).
NOTE: One more alternative, compose data as follows;
* left arg as nx2 array, each row is (indices;newvals)
* right arg as boxed array (1 cell)
* result is modified boxed array (1 cell)
box_amend =: 4 : '<(>1{x) (>0{x) } >y'
((<"1 each idx),.contents) box_amend"1 0 m
+--------+----------+
| 0 46 99|46 0 0 0|
| 0 0 0| 0 0 0 99|
| 0 0 0| 0 0 0 0|
|23 0 62| 0 0 0 0|
|42 0 0| 0 0 23 62|
|44 12 0| |
+--------+----------+
This 'loops' via rank operator using a row on left (indices;vals) and a
'cell' on the right. (Single cell case now needs a boxed right arg).
Rob Hodgkinson
On 30/03/08 5:09 PM, "Rob Hodgkinson" <[EMAIL PROTECTED]> wrote:
> Writing box_amend for a 'single' case,
> Where left is (scatind,<newvals), right arg is >firstcell...
>
> box_amend =: 4 : 0
> (>{:x) (}:x) } y
> )
>
> Then the left arg for eg the first cell is:
> ] lf =: (<"1]>0{idx), 0{contents
> +---+---+---+---+---+---+---+--------------------+
> |0 1|0 2|3 0|3 2|4 0|5 0|5 1|46 99 23 62 42 44 12|
> +---+---+---+---+---+---+---+--------------------+
> ] lf box_amend >0{m NB: Right arg is rect array
> 0 46 99
> 0 0 0
> 0 0 0
> 23 0 62
> 42 0 0
> 44 12 0
>
> So looped result is now done under 'each' with a simple restructure of your
> index and contents as...(scatind1,<contents1);(scatind2,<contents2) etc
> (tidx ,each <"0 contents) box_amend each m
> +--------+----------+
> | 0 46 99|46 0 0 0|
> | 0 0 0| 0 0 0 99|
> | 0 0 0| 0 0 0 0|
> |23 0 62| 0 0 0 0|
> |42 0 0| 0 0 23 62|
> |44 12 0| |
> +--------+----------+
>
> Regards, Rob Hodgkinson
>
>
> On 30/03/08 2:27 PM, "Sherlock, Ric" <[EMAIL PROTECTED]> wrote:
>
>> I want to amend scattered indexes of a boxed list of arrays (m).
>
> I can do it using amendloop below, but want to get rid of the loop if I can.
>
> ]m=: (6 3$0);5 4$0
> +-----+-------+
> |0 0 0|0 0 0 0|
> |0 0 0|0 0 0 0|
> |0 0 0|0 0 0 0|
> |0 0 0|0 0 0 0|
> |0 0 0|0 0 0 0|
> |0 0 0| |
> +-----+-------+
>
> idx=: 7 2$ 0 1 0 2 3 0 3 2 4 0 5 0 5 1
> ]idx=: idx;4 2$ 0 0 1 3 4 2 4 3
> +---+---+
> |0 1|0 0|
> |0 2|1 3|
> |3 0|4 2|
> |3 2|4 3|
> |4 0| |
> |5 0| |
> |5 1| |
> +---+---+
> ]contents=: (7?.100);4?.100
> +--------------------+-----------+
> |46 99 23 62 42 44 12|46 99 23 62|
> +--------------------+-----------+
>
> amendloop=: 3 : 0
> n=.''
> for_cnt. contents do.
> n=.n,< (>cnt) (<"1 cnt_index{::idx) } cnt_index{::m
> end.
> )
>
> amendloop ''
> +--------+----------+
> | 0 46 99|46 0 0 0|
> | 0 0 0| 0 0 0 99|
> | 0 0 0| 0 0 0 0|
> |23 0 62| 0 0 0 0|
> |42 0 0| 0 0 23 62|
> |44 12 0| |
> +--------+----------+
>
> I imagine it should be something along the lines of:
> contents (<"1 each idx)} each m
>
> But that gives a length error. Any ideas?
>
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm