Можете ли вы описать, что происходит в этой операции? - PullRequest
0 голосов
/ 13 июня 2018

Код ниже находится в программе Python, которую я использую.И T, и P являются 3,414024 матрицами.Я не знаю, что такое "."делает, и не смогли найти четкого ответа.К сожалению, он использует слишком много памяти, поэтому я пытаюсь найти более эффективный способ кодирования операции:

np.matrix(T+P).T*np.matrix(T+P)

Это часть этой строки:

N1 = (T+P)/np.sqrt(np.diag(np.matrix(T+P).T*np.matrix(T+P)))

Спасибо за любой совет, который вы можете дать!

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Существует несколько очевидных оптимизаций:

  • вычислите T+P только один раз и сохраните его во временном TP, скажем
  • не вычисляйте полную матрицу TP.T @ TP только для немедленного отбрасывания всего, кроме диагонали - вместо этого сначала вычисляются только диагональные элементы: np.einsum('ij,ij->j', TP, TP)

С вашими числами второе должно сократить как время вычислений, так и объем используемой памятисовершенно нелепым фактором в 10 ^ 4 - 10 ^ 5.

Кроме того:

  • избегайте класса matrix в пользу array

Для подведения итогов используйте:

TP = T+P
N1 = TP/(np.sqrt(np.einsum('ij,ij->j', TP, TP)))
0 голосов
/ 13 июня 2018

Следующая строка:

np.matrix(T+P).T*np.matrix(T+P)

в основном сначала выполняет поэлементное сложение (T+P), а затем результат транспонируется с использованием .T.Это (матрица) умножается на матрицу, полученную из (np.matrix(T+P))

Ниже приведен пример с игрушкой:

In [14]: m
Out[14]: 
matrix([[1, 2, 3, 4],
        [2, 3, 4, 5]])

In [15]: n
Out[15]: 
matrix([[10, 20, 30, 40],
        [11, 21, 31, 41]])

In [16]: m.T * n
Out[16]: 
matrix([[ 32,  62,  92, 122],
        [ 53, 103, 153, 203],
        [ 74, 144, 214, 284],
        [ 95, 185, 275, 365]])

Обратите внимание, что транспонирование m (то есть m.T) - это должен , чтобы умножение матрицы (*) работало.


Как видно из приведенного выше примера, размерность результирующей матрицы получается изразмерность столбцов, поскольку размеры в строках сокращаются (4x2, 2x4 => 4x4) Таким образом, поскольку ваши матрицы очень велики (3x414024), потребление памяти также огромно.


ПослеОперация сложения (T+P), размеры результирующей матрицы одинаковы (3x414024).И при переносе это становится (414024x3).Это, в свою очередь, умножение матрицы на другую (3x414024) матрицу дает в результате матрицу размерности (414024x414024), которая определенно является огромной матрицей.

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