Как создать многоугольную квадратную матрицу в Theano? - PullRequest
0 голосов
/ 12 апреля 2020

Есть ли лучший способ создать многоугольную квадратную матрицу в theano, чем следующий,

A = theano.tensor.nlinalg.AllocDiag(offset=0)(x)
A += theano.tensor.nlinalg.AllocDiag(offset=1)(x[:-1])
A += theano.tensor.nlinalg.AllocDiag(offset=-1)(x[1:])

где x - это вектор, который я хочу на диагонали? Каждый раз, когда я вызываю AllocDiag()(), создается новый узел Apply, который вызывает проблемы с памятью и неэффективность.

Я надеюсь, что есть способ, похожий на scipy, где список векторов можно передать в функцию с помощью соответствующий список смещений см. https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.diags.html.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 13 апреля 2020

Один из способов, который не требует AllocDiag()(), - это использовать theano.tensor.set_subtensor() с A[range(n),range(n)] для получения диагональных индексов, где A - матрица n*n. Примерно так:

A = tt.set_subtensor(A0[range(n),range(n)], x)
A = tt.set_subtensor(A[range(n-1),range(1,n)], x[:-1])
A = tt.set_subtensor(A[range(1,n),range(n-1), x[1:])

, где A0 - исходная матрица, например, матрица нулей.

...