给定张量流中的三个一维张量(即矢量),是否存在一种巧妙(有效)的方法来制作三对角矩阵,方法是将一个矢量放在次对角线上,将另一个放在对角线上,最后将一个放在超对角线。
tf.diag使得从其中一个向量中创建对角矩阵变得容易。
您是否也可以举一个使用tf.while_loop的例子。
答案 0 :(得分:1)
这是使用tf.scatter_nd
的一种方法:
import tensorflow as tf
def tridiagonal(diag, sub, sup):
n = tf.shape(diag)[0]
r = tf.range(n)
ii = tf.concat([r, r[1:], r[:-1]], axis=0)
jj = tf.concat([r, r[:-1], r[1:]], axis=0)
idx = tf.stack([ii, jj], axis=1)
values = tf.concat([diag, sub, sup], axis=0)
return tf.scatter_nd(idx, values, [n, n])
diag = tf.placeholder(tf.int32, [None])
sub = tf.placeholder(tf.int32, [None])
sup = tf.placeholder(tf.int32, [None])
tri = tridiagonal(diag, sub, sup)
with tf.Session() as sess:
print(sess.run(tri, feed_dict={diag: [0, 1, 2, 3],
sub: [4, 5, 6],
sup: [7, 8, 9]}))
输出:
[[0 7 0 0]
[4 1 8 0]
[0 5 2 9]
[0 0 6 3]]