在TensorFlow中使用单位对角矩阵创建下三角

时间:2018-07-28 11:40:46

标签: python tensorflow matrix

我想用向量中的对角线元素创建一个较低的三角矩阵。

从矢量

[a_21, a_31, a_32, ..., a_N1, ... , a_N(N-1)]

如何将其转换为具有形式为单位对角线元素的下三角矩阵,

[[1, 0, ..., 0], [a_21, 1, ..., 0], [a_31, a_32, 1, ..., 0], ..., [a_N1, a_N2, ... , a_N(N-1), 1]]

到目前为止,NumPy

import numpy
A = np.eye(N)
idx = np.tril_indices(N, k=-1)
A[idx] = X

TensorFlow不支持项目分配。我认为fill_triangulartf.reshape可以帮助解决问题,但是我不确定该怎么做。

2 个答案:

答案 0 :(得分:0)

您可以在升序数组上使用fill_triangular_inverse(例如,像np.arange中的数组一样)。

然后,您将获得索引,它们如何在下三角形中结束,您可以将其应用于数组以重新排序并将其传递给fill_triangular

答案 1 :(得分:0)

我发现了类似的问题和答案: Packing array into lower triangular of a tensor

基于上面的页面,我制作了一个函数,可以将向量转换为带有对角线元素的下三角形:

def flat_to_mat_TF(vector, n):
    idx = list(zip(*np.tril_indices(n, k=-1)))
    idx = tf.constant([list(i) for i in idx], dtype=tf.int64)
    values = tf.constant(vector, dtype=tf.float32)

    dense = tf.sparse_to_dense(sparse_indices=idx, output_shape=[n, n], \
                               sparse_values=values, default_value=0, \
                               validate_indices=True)
    mat = tf.matrix_set_diag(dense, tf.cast(tf.tile([1], [n]), dtype=tf.float32))
    return mat

如果输入矢量已经是张量,则values = tf.constant()可以消除。