Another approach for this is:
   (x*-.q)+y*q

Sadly, that only works when x and y are numeric. Boxes and literals do
not have zero and 1 values (hypothetically "fill" could be zero, but
"1" is harder to rationalize.)

A variant which uses amend might be:
   (q#y) (I.q)} x

This only works when x and y are rank 1, but you could also use
something like this for higher ranked arrays:
   ($q)$ (q#&,y) (I.,q)} ,x

(I hope I didn't make too many mistakes this time. I'm running without
any corrective support.)

Thanks,

-- 
Raul

On 7/7/14, Erling Hellenäs <[email protected]> wrote:
> Hi all !
>
> About the problem I want to solve.
>
> Generally you compare some arrays and you want to replace part of one of
> them with info from the other or from some other array of the same
> dimensions?
>
> I found a solution not using Amend:
>
> NB. x and y are arrays of the same rank
>
> NB. q is a boolean, also of this rank
>
> NB. The expression merges x and y.
>
> NB. Where q is TRUE it picks from y, otherwise x
>
> NB. q {"0 1 x,"0 y
>
> 1 2 3(< {"0 1 [ ,"0 ])2 2 2
> 2 2 3
>
>
> A similar solution using Amend. I'm sure it can be improved, just I
> didn't do it yet. I didn't try it for the general case.
>
>
> NB. Amend
>
> NB. x (v0`v1`v2)} y ↔ (x v0 y) (x v1 y)} (x v2 y)
>
> 1 2 3(> # [)`(> # [: i. [: $ ])`(])}2 2 2
> 2 2 3
>
>
> I think what makes Amend tricky is that you(as Ric says) need three
> inputs. To get them into the tacit expression you have to put two of
> them together in one noun.
>
>
> There are probably other solutions using sort.
>
>
> Trying the same expression with a version of Raul's Amend:
>
> amende=: (0 {:: [)`(1 {:: [)`]}
>
> 1 2 3((> (# ; [: (# i.&$) [ ) [) amende ])2 2 2
>
> 2 2 3
>
>
> Some bug causes Thunderbird to reformat my mails. Hope you get them right.
>
> I'm looking for something more general than this :)
>
> 1 2 3 >. 2 2 2
>
> 2 2 3
>
>
> /Erling
>
> On 2014-07-07 05:58, Raul Miller wrote:
>> Since it'w nagging at me (and this is still unteted code :/), here's
>> what I currently think i should have said:
>>     amend=: (0:{::])`(1:{::])`(2:{::])}~
>>
>> The trailing ~ because I need the dyad from the resulting verb, and
>> the trailing ] on each because those verbs need to ignore one of the
>> resulting arguments.
>>
>> Sadly, my fingers (and "quick memory") keep forgetting this.
>>
>> Thanks,
>>
>
> ----------------------------------------------------------------------
> 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