我想用向量中的对角线元素创建一个较低的三角矩阵。
从矢量
[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_triangular
或tf.reshape
可以帮助解决问题,但是我不确定该怎么做。
答案 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()
可以消除。