A question about broadcasting a general expression graph. The specific use 
is in the gradient of the distance to a sphere: 

c = T.vector('c') # center
r2 = T.scalar();  # radius
p = T.matrix('g') # points N x 3
e = (r2-(c-p).norm(2,axis=1)) # distances N 


G1 = T.grad(e,p) # error - because e is vectorial
GJ = T.jacobian(e,p) # generates a N x N x 3 jacobian,and I don't want the 
intermediates

The workaround for the above is to express the equation over a vector:

pv = T.vector('g') # single point
ev = (r2-(c-pv).norm(2)) # 1
Gv = T.grad(ev,pv) # 1 x 3

But then if I want to evaluate a function obtained from Gv over a matrix of 
points x sized N x 3 I need to iterate, and that's inefficient:

f = function([r2,c,pv],Gv)

for i in range(0,x.shape[0]):
 rg[i,:] = f(3.0,...,x[i,:])

Instead of this loop I would like to create a single symbolic expression 
that takes N point and produces all the gradients giving as output N x 3. 

Is there anyway to perform this operation? It seems like a broadcasting 
operation of a subexpression (ev) by replacing one of the terms (pv) with a 
row from the input (x). The replace method of the expression graph does not 
work because it is not possible to transform a vector term to a matrix term.

Any suggestion will be appreciated

Best Regards,
Emanuele



-- 

--- 
You received this message because you are subscribed to the Google Groups 
"theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to