2017-09-08 6 views
2

J'ai R comme matrices de rotation 2D de la forme (N,2,2). Maintenant, je souhaite étendre chaque matrice à (3,3) matrices de rotation 3D, c'est-à-dire mettre des zéros dans chaque [:,:2,:2] et mettre 1 à [:,2,2].Comment tamponner plusieurs tenseurs avec un autre sur la diagonale principale et des zéros ailleurs?

Comment faire cela en tensorflow?

MISE À JOUR

J'ai essayé cette façon

R = tf.get_variable(name='R', shape=np.shape(R_value), dtype=tf.float64, 
         initializer=tf.constant_initializer(R_value)) 
    eye = tf.eye(np.shape(R_value)[1]+1) 
    right_column = eye[:2,2] 
    bottom_row = eye[2,:] 
    R = tf.concat([R, right_column], 3) 
    R = tf.concat([R, bottom_row], 2) 

mais a échoué, parce que concat ne fait pas la diffusion ...

MISE À JOUR 2

Je explicitées diffusion et également corrigé les mauvais indices dans concat appels:

R = tf.get_variable(name='R', shape=np.shape(R_value), dtype=tf.float64, 
         initializer=tf.constant_initializer(R_value)) 
    eye = tf.eye(np.shape(R_value)[1]+1, dtype=tf.float64) 

    right_column = eye[:2,2] 
    right_column = tf.expand_dims(right_column, 0) 
    right_column = tf.expand_dims(right_column, 2) 
    right_column = tf.tile(right_column, (np.shape(R_value)[0], 1, 1)) 

    bottom_row = eye[2,:] 
    bottom_row = tf.expand_dims(bottom_row, 0) 
    bottom_row = tf.expand_dims(bottom_row, 0) 
    bottom_row = tf.tile(bottom_row, (np.shape(R_value)[0], 1, 1)) 

    R = tf.concat([R, right_column], 2) 
    R = tf.concat([R, bottom_row], 1) 

Les solutions semblent plutôt complexes. Y en a-t-il de plus simples?

Répondre

0

premiers zéros pad à [N, 2, 2] pour être [N, 3, 3] avec padded = tf.pad(R, [[0, 0], [0, 1], [0, 1]])

puis convertir padded[N, 2, 2]-1:

depuis tf.Tensor ne prend pas en charge l'affectation, vous pouvez le faire avec l'initialisation d'une np.array, puis les ajouter ensemble.

arr = np.zeros((3, 3)) 
arr[2, 2] = 1 
R = padded + arr # broadcast used here 

maintenant la variable R est ce que vous avez besoin