Примените cupy.linalg.svd к стеку матриц - PullRequest
1 голос
/ 04 апреля 2019

Я хотел бы выполнить SVD (разложение по сингулярным значениям) через cupy.linalg.svd по стеку матриц, вычисляя SVD для каждой матрицы.

import cupy as cp
arr = cp.random.uniform(size=(1000, 3, 3), dtype=cp.float32)
sing_vals = cp.linalg.svd(arr, compute_uv=False, full_matrices=False)

Это дает ошибку, утверждая, что arrне 2DПо-видимому, cp.linalg.svd может вычислять SVD только для одной двумерной матрицы.Однако numpy.linalg.svd всегда вычисляет SVD по двум последним осям массива, что намного мощнее.


Есть ли способ эффективно вычислить SVD по стеку матриц вcupy?

Еще лучше, есть ли общий метод для эффективного apply_along_axis?

1 Ответ

3 голосов
/ 05 апреля 2019

Текущая реализация CuPy вызывает cusolverDn<t>gesvd(), которая не поддерживает пакетные вычисления. Я полагаю, что для эффективного пакетного вычисления CuPy должен вызвать API CUDA, который получает пакетные входные данные.

К вашему сведению, чтобы улучшить CuPy, cuSOLVER имеет cusolverDn<t>gesvdjBatched() и cusolverDn<t>gesvdaStridedBatched(), что представляется возможным использовать для пакетного SVD (плотных общих матриц). Я не имею понятия о разнице между алгоритмами SVD. j обозначает метод Якоби, а a обозначает приблизительный.

...