我想以编程方式创建这样的内容:
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]
所以a是整个陈述。这还没有做任何事情。然后有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()
执行所有操作。
答案 0 :(得分:1)
您可以使用功能嵌套:
def nest(f, g):
def h(x):
return f(g(x), x)
return h
expr = lambda (a,b) : a
expr = nest((lambda x, (a, b): x + (a - b)), expr)
expr = nest((lambda x, (a, b): x + (a - b)), expr)
print expr((1,2)) # prints -1
关于示例代码,您可以执行类似的操作(将nest
修改为不使用参数):
def nest(f, g):
def h():
return f(g())
return h
expr = lambda: (_vec, _init)[1]
expr = nest(lambda x: T.set_subtensor(x[1], x[0] * 2)[1], expr)
expr = nest(lambda x: T.set_subtensor(x[2], x[1] * 2)[1], expr)
expr = nest(lambda x: T.set_subtensor(x[3], x[2] * 2)[1], expr)
expr = nest(lambda x: T.set_subtensor(x[4], x[3] * 2)[1], expr)
test_vector = function([], outputs=expr)
subt = test_vector()