meco-group / tensor-tools

Extending CasADi to handle sparse tensors efficiently
0 stars 0 forks source link

inner product #5

Closed ErikLambrechts closed 8 years ago

ErikLambrechts commented 8 years ago

zou een (soort van) inner procduct methode mogelijk zijn. twee tensors gaan er in en een tensor komt er uit.

a = [0,1,2]   (dim = (3))
b = [1,2,3]   (dim = (3))
c = [0,1
     2,3
     4,5]     (dim = (3,2))

inner(a,b) = [8]                                (dims = ()) (nul dims valid?)
         ( = 0*1 + 1*2 + 2*3)

inner(a,c) = [10 13]                            (dims = 2)
         ( = 0*[0,1] + 1*[2,3] + 2*[4,5])
jgillis commented 8 years ago

Kan je deze even in Index/einstein notation zetten?

ErikLambrechts commented 8 years ago

De compactste notatie zou iets recursief zijn.

def inner(A,B):
  if A.dims == () or  B.dims == ()
    return A*B // een van beide is een getal
  else
    assurt(A.dims[0] == B.dims[0])
    return sum([A(i,:)*B(i,:)  for i  in range(A.dims[0])])

De recursie kan je vervangen door een een uitgebreidere som

jgillis commented 8 years ago

a_ijk... * a_ilm...?

Of moet het inner(A(i,:),B(i,:)) zijn?

Dan is het eerder:

a_ijk * a_ijklm...?

jgillis commented 8 years ago

De tweede intepretatie heb ik nu geimplenteerd als inner.

Is dit het product dat je eens aan bord beschreef? Mijn interpretatie daarvan was "Perform a matrix product on the first two indices", partial_product in implementatie, wat wel een erg vreemd beest was..

ErikLambrechts commented 8 years ago

Ik test het zo snel mogelijk