Re: In search of elegant indices searching


#1

Dear Tim,

thanks for your reply.
I am a bit tired today and the task is a little involved,
so I try to let others work for me :slight_smile:
I want to evaluate some mathematical function , which has
arguments β€˜x’,β€˜y’,β€˜z’ etc. (think of something like

(x,y,z) -> 5zy+x*y**2)

)
at different values for these variables x,y,z.
Actually, I’ve got data, and I am trying to get back that function, or
an
approximation to it, from these data, so it’s actually a (multivariate)
interpolation problem. To do that efficiently, I need to hold
several variable values fixed at some point in time while varying
others.

So, in my example, if I have a Hash like

my_hash={β€˜x’,[1,1,3,1,5,6],β€˜w’,[1,2,3,1,4,5],β€˜y’,[1,1,1,4,4,6]} ,

then these are coordinates where the unknown function is evaluated at.

If, now, the nice and wonderful method I search for, gives me

res={{β€˜x’=>1,β€˜w’=>1}=>[0,3],{β€˜x’=>3,β€˜w’=>3}=>[2],{β€˜x’=>5,β€˜w’=>4}=>[4],{β€˜x’=>6,
β€˜w’=>5}=>[5]},

I know that at the 0-th and 3-th measurement point, β€˜x’ and β€˜w’ didn’t
vary,
so, any
change in the function values is due to the change of β€˜y’ from 1 to 4.

Do you have any elegant ideas for that ?

Thank you,

Best regards,

Axel


#2

my_hash={β€˜x’,[1,1,3,1,5,6],β€˜w’,[1,2,3,1,4,5],β€˜y’,[1,1,1,4,4,6]} ,

res={{β€˜x’=>1,β€˜w’=>1}=>[0,3],{β€˜x’=>3,β€˜w’=>3}=>[2],{β€˜x’=>5,β€˜w’=>4}=>[4],{β€˜x’=>6,
β€˜w’=>5}=>[5]},

I know that at the 0-th and 3-th measurement point, β€˜x’ and β€˜w’ didn’t vary,
so, any change in the function values is due to the change of β€˜y’ from 1 to 4.

I still don’t get it:

{β€˜x’=>1,β€˜w’=>1}=>[0,3]
means the 0th and 3rd point are both β€˜1’

{β€˜x’=>3,β€˜w’=>3}=>[2]
means the 2nd point is 3 in both

{β€˜x’=>5,β€˜w’=>4}=>[4]
now it gets weird, this means the 4th position of x is 5 and of w is
4… Why only that result? Seems a little arbitrary, why doesn’t the
result contain:
{β€˜x’=>1,β€˜w’=>2}=>[1]
?

And how come y is left out of the results alltogether?
How about this:
def whatever arr1, arr2
h = {}
arr1.each_with_index { |val, i|
h[[val, arr2[i]]] ||= []
h[[val, arr2[i]]].push i
}
h
end

whatever([1,1,3,1,5,6], [1,2,3,1,4,5]) # => {[1, 2]=>[1], [5, 4]=>[4],
[3, 3]=>[2], [1, 1]=>[0, 3], [6, 5]=>[5]}

-tim