我想以编程方式创建这样的东西:
a = (_vec, T.set_subtensor(_vec[0], _init[0]))[1]
b = (a, T.set_subtensor( a[1], a[0] * 2))[1]
c = (b, T.set_subtensor( b[2], b[1] * 2))[1]
vec_update = (c, T.set_subtensor(c[3], c[2] * 2))
test_vector = function([], outputs=vec_update)
subt = test_vector()
我们得到了a = (_vec, T.set_subtensor(_vec[0], _init[0]))[1]
一个完整的声明。这还没有做任何事情。然后是b = (a, T.set_subtensor( a[1], a[0] * 2))[1]
哪个取决于a
并且是另一个语句本身。这一直持续到vec_update
。我知道它看起来很难看,但它只是更新了一个向量的列,比如返回一个看起来像这样的向量col[n] = col[n-1] * 2
:col[0] = 1
[[ 1. 2. 4. ..., 32. 64. 128.]]
现在想象一下,我想这样做一千次..因此我想知道我是否可以生成这样的语句,因为它们遵循一个简单的模式。
这些“连接的”语句直到
test_vector = function([], outputs=vec_update)
这是当它们被编译为CUDA-code
和
subt = test_vector()
确实执行一切。