Кодирование повторной суммы сумм в python - PullRequest
0 голосов
/ 17 декабря 2018

Для фиксированных целых чисел альфа и k с фиксированным i

, где всеПеременные x и y известны заранее.(по сути, это альфа-координата большого повторного умножения матрицы на вектор)

Для нормальной суммы, варьирующейся по одному индексу, я обычно создаю 1d-массив A и устанавливаю A [i] равным i-й индексированной записизатем в сумме используется сумма (A), но в приведенном выше примере записи самой внутренней суммы зависят от индексов в предыдущей сумме, которые, в свою очередь, зависят от индексов в сумме до этого, вплоть до первогосумма, которая мешает мне использовать этот такт простым способом.

Я попытался создать двумерный массив B соответствующей длины и ширины и установить строку 0 в качестве записей в самой внутренней сумме, затем 1 строку в качествезаписи в следующей сумме умножаются на sum(np.transpose(B),0) и т. д., но значение первой суммы (строки 0) должно меняться с каждой записью в строке 1, поскольку эта сумма все еще имеет индексы, зависящие от нашей позиции в строке 1, и т. д.и так далее, вплоть до суммы ki.

Сумма, которая учитывает «переменную», заполненную каждой позицией массива, это suТаким образом, через mming можно было бы добиться цели, но я не могу найти ничего похожего на эти строки, и мои попытки взломать одну из них пока не увенчались успехом - моя интуиция говорит, что есть решение, которое включает суммирование по осям ki-измерениямассив, но я еще не смог сделать это точным.Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Это на 95% идентично ответу @ sehigle, но включает общий N вектор:

def nested_sum(XX, Y, N, alpha):
    intermediate = np.ones(N[-1], dtype=XX.dtype)

    for n1, n2 in zip(N[-2::-1], N[:0:-1]):
        intermediate = np.sum(XX[:n1, :n2] * Y[:n2] * intermediate, axis=1)

    return np.sum(XX[alpha, :N[0]] * Y[:N[0]] * intermediate)

Точно так же я не знаю выражения, поэтому я не уверен, как построитьсоответствующие тесты.Но он работает: \

0 голосов
/ 17 декабря 2018

Одна простая попытка жестко закодировать что-то вроде этого было бы:

for j0 in range(0,n0):
    for j1 in range(0,n1):
        ....

Редактировать: (векторизованная версия)

Вы могли бы сделать что-то вроде этого: (Я не сделалпроверить это)

temp = np.ones(n[k-i])
for j in range(0,k-i):
    temp = x[:n[k-i-1-j],:n[k-i-j]].T@(y[:n[k-i-j]]*temp)
result = x[alpha,:n[0]]@(y[:n[0]]*temp)

Основная идея заключается в том, что вы пытаетесь запрессовать его в матрично-векторную форму.(обратите внимание, что это синтаксис python3)

Редактировать: Вы должны заметить, что вам нужно изменить "k-1" на самую внутреннюю сумму (я только что сделал это для всех сумм вплоть до индекса ki)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...