0

我想以编程方式创建这样的东西:

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] * 2col[0] = 1

[[   1.    2.    4. ...,   32.   64.  128.]]

现在想象一下,我想这样做一千次..因此我想知道我是否可以生成这样的语句,因为它们遵循一个简单的模式。

这些“连接的”语句直到

test_vector = function([], outputs=vec_update) 

这是当它们被编译为CUDA-code

subt = test_vector() 

确实执行一切。

4

1 回答 1

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()
于 2014-06-15T21:02:48.470 回答