Python 创建矩阵运算张量

Python 创建矩阵运算张量,python,numpy,tensorflow,Python,Numpy,Tensorflow,我试图在TensorFlow中实现一种非线性滤波器,但在一步的实现中遇到了问题。该步骤基本上类似于: x_update=x.assign(tf.matmul(A,x)) 问题在于矩阵A的结构类似于: A=[[1,0.1,0,0,0], [0, 1, 0, 0, 0], [0,0,f1(x),f2(x),f3(x)], [0,0,f4(x),f5(x),f6(x)],, [0, 0, 0, 0, 1]] 其中,每个fn(x)都是my状态的非线性函数;类似于tf.sin(x[4])甚至x[2]*

我试图在TensorFlow中实现一种非线性滤波器,但在一步的实现中遇到了问题。该步骤基本上类似于:

x_update=x.assign(tf.matmul(A,x))
问题在于矩阵
A
的结构类似于:

A=[[1,0.1,0,0,0],
[0, 1, 0, 0, 0],
[0,0,f1(x),f2(x),f3(x)],
[0,0,f4(x),f5(x),f6(x)],,
[0, 0, 0, 0, 1]]
其中,每个
fn(x)
都是my状态的非线性函数;类似于
tf.sin(x[4])
甚至
x[2]**2*tf.sin(x[4])+x[3]**2*tf.cos(x[4])

我不知道如何创建我的
矩阵,以便它嵌入这些操作。我首先用一些值初始化它:

A_mat=np.eye(5)
A_mat[0,1]=0.1
A=tf.Variable(A_mat,dtype=tf.float32,trainable=False,name='A')
然后我尝试使用
tf.scatter\u update
进行一些切片更新,类似于:

#定义我的非线性操作。
f1=tf.cos(…)
f2=tf.sin(…)
# ...
#定义我要替换的零件。
新的部分=tf.常数(tf.转换为张量[f1,f2,f3],
[f4,f5,f6]]))
#定义切片索引并更新矩阵。
inds=[zip中VAL的VAL(np.arange(1,3),np.arange(2,5))]
A_update=tf.scatter_update(A,tf.constant(inds),新的部分,name='A_update')
这给了我一个错误,说明:

ValueError:形状的秩必须相等,但为1和0

将形状1与其他形状合并。对于输入形状为[1]、[1]、[]、[]、[]、[]、[]、[]、[]的“打包/0”(op:“打包”)

我还尝试将我的矩阵
新的\u部分
重新分配到numpy定义的
A\u mat
,但我得到了一个不同的错误,我认为这是由于数值数组突然被分配张量元素时出现了意外的数据类型

那么,有人知道如何定义一个操作矩阵,当矩阵像这样使用时,它会更新吗

理想情况下,我希望定义矩阵
A
,以便
A
中更新的所有操作都是调用
A
的一部分,并自动发生。这样,我就可以完全避免切片分配,只会感觉更紧张

谢谢大家!


更新: 我通过将我的ops包装在
tf.reformate(op_name,[])
中并将我的更新更改为:

new_part=tf.将_转换为_张量([[0,0,f1,f2,f3],
[0,0,f4,f5,f6]]))
行=np.arange(开始行,结束行)
A\u update=tf.scatter\u update(A,行,新部分,name='A\u update')
结果表明,它只能对变量的第一维进行操作,因此我必须向它提供整行数据,并将行索引放在我想放它们的地方。这有帮助,但仍然留下我的问题:


我的问题:
定义这个
A
矩阵的最佳、最张量的方法是什么,这样那些常量元素保持不变,而那些在我的图上是其他张量操作的元素就嵌入到
A
中?我想在我的图表上调用
a
,以查看并运行这些更新,而无需手动执行
tf.scatter\u update
。或者这是正确的方法吗?

更新子矩阵的最简单方法是使用tensorflow的python切片操作

import numpy as np
import tensorflow as tf
A = tf.Variable(np.zeros((5, 5), dtype=np.float32), trainable=False)
new_part = tf.ones((2,3))

update_A = A[2:4,2:5].assign(new_part)

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
print(update_A.eval())
# array([[ 0.,  0.,  0.,  0.,  0.],
#        [ 0.,  0.,  0.,  0.,  0.],
#        [ 0.,  0.,  1.,  1.,  1.],
#        [ 0.,  0.,  1.,  1.,  1.],
#        [ 0.,  0.,  0.,  0.,  0.]], dtype=float32)

问题是当您没有新的_part=tf.constant。。。tensorflow试图将所有的张量f1、f2、f2等叠加到一个矩阵中,但它们的形状并不相同;将它们全部重塑为标量,它应该会起作用。@AlexandrePassos谢谢!在
tf.reforme(…,[])
中包装ops之后,它变得越来越近了,但是我现在在
tf.scatter\u update的实现中遇到了错误。尽管取得了进步!