I have a better version!
This one, despite an ugly for loop, uses more J array power and outperforms
my previous attempt by an order of magnitude in time and space.
ffrom=:4 :0"0 _
x=.,>x
a=.(2"0 x) {. (<.x) }. y
mult=. (,.~-.) (-<.) x
for_m. mult do.
a=. m +/@:* a
end.
a
)
6!:2 '(<?20$0) ffrom i.20#2'
0.0627697
7!:2 '(<?20$0) ffrom i.20#2'
75506048
Note that this one, because of its use of head, substitutes 0 for any value
that is out of range. It also doesn't work for negative indices.
Marshall
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Ben Gorte - LR
Sent: Sunday, January 23, 2011 3:59 PM
To: Programming forum
Subject: Re: [Jprogramming] Floating from
Wow, this is really great!
I'll use yours!
I started ffrom because I have an 'expensive' forward model with 8
parameters, which is then going to be inverted using iterative least
squares.
So I will apply ffrom2 very many times.
Ben
-----Original Message-----
From: [email protected] on behalf of Marshall Lochbaum
Sent: Sun 1/23/2011 9:33 PM
To: 'Programming forum'
Subject: Re: [Jprogramming] Floating from
One correction to ffrom2:
ffrom2=:4 :0 "0 _
x=.,>x
range=. { (<.,>.)&.> x
mult=. *// (,.~-.) (-<.) x
mult +/^:(#x)@:* range{y
)
Now it replicates all of your results.
This version outperforms yours in speed and space:
6!:2 '(<?20$0) ffrom i.20#2'
5.51853
6!:2 '(<?20$0) ffrom2 i.20#2'
1.44303
7!:2 '(<?20$0) ffrom i.20#2'
1535325568
7!:2 '(<?20$0) ffrom2 i.20#2'
666901632
However, I would like to see a version that only uses the one value if an
integer is given (mine uses two copies of the same value and gives weight 1
to one of them and 0 to the other).
Marshall
-----Original Message-----
From: Marshall Lochbaum [mailto:[email protected]]
Sent: Sunday, January 23, 2011 3:21 PM
To: 'Programming forum'
Subject: RE: [Jprogramming] Floating from
This is a version that works only for lists. Given an exact index, it does
not interpolate; given a value outside of the range, it halts with an index
error.
ffromlist=:4 :0"0 1
range=. (<.,>.) x
mult=.(,~-.) (-<.) x
mult +/@:* range{y
)
A similar, but less thoroughly tested, model for arbitrary rank is given
below.
ffrom2=:4 :0 "0 _
range=. { (<.,>.)&.> >x
mult=. *// (,.~-.) (-<.) ,>x
mult +/@,@:* range{y
)
Marshall
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Ben Gorte - LR
Sent: Sunday, January 23, 2011 11:38 AM
To: [email protected]
Subject: [Jprogramming] Floating from
Hi,
I believe I made a nice verb, called ffrom. It acts like { (from) :
1 3 ffrom i.10
1 3
(<1 3) ffrom i.3 5
8
(<1 3) ffrom i.3 5 6
48 49 50 51 52 53
but it also does:
1.4 3.2 ffrom i.10
1.4 3.2
(<1.4 3.2) ffrom i.3 5
10.2
(<1.4 3.2) ffrom i.3 5 6
61.2 62.2 63.2 64.2 65.2 66.2
It does that by multi-linear interpolation in any-dimensional grids:
(<0.5 0.5) ffrom 2 2$0 0 0 10
2.5
(<1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8) ffrom i. 3 3 3 3 3 3 3 3
3771.6
Here it is:
ffrom
4 : 0"0 _
vect =. _1e_7 + >x
n =. 2^#vect
bin =. #:i.n
pos =. <.vect
frac =. vect-pos
+/(*/(,./bin){"0 1 (1-frac),.frac) * (;/"2 pos +"1 1 bin) { y
)
I have no doubts that members in this forum can make it nicer.
What i particularly do not like is the _e_7 at the beginning.
Its only purpose is to allow for
(n-1) ffrom i.n=.4
3
which otherwise would interpolate between the 3rd and 4th element causing an
index error. If I want to solve that in another way it gets messy. By the
way,
_1 _1.5 _2 ffrom i.4
3 2.5 1
looks okay to me, and
_0.3 ffrom i.4
0.9
interpolates between the last and the first value, which also seems
reasonable.
Finally,
(<?20$0) ffrom i.20#2
281616
interpolates between the 1,048,576 vertices of a 20-dimensional hypercube
:-)
Of course improvements and other suggestions will be greatly appreciated.
Perhaps it can end up in the wiki?
Greetings,
Ben
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm