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 に答える