在一堆矩阵上应用 cupy.linalg.svd
Apply cupy.linalg.svd over a stack of matrices
我想通过 cupy.linalg.svd
对矩阵堆栈执行 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,这更强大。
有没有一种方法可以有效地计算 cupy
中一堆矩阵的 SVD?
更好的是,有没有一种通用的方法可以有效地apply_along_axis
?
当前的 CuPy 实现调用 cusolverDn<t>gesvd()
,不支持批量计算。为了进行高效的批处理计算,我想 CuPy 必须调用接收批处理输入的 CUDA API。
仅供参考,以改进 CuPy,cuSOLVER 具有 cusolverDn<t>gesvdjBatched()
和 cusolverDn<t>gesvdaStridedBatched()
,它们似乎可用于批处理 SVD(密集一般矩阵)。我不知道 SVD 算法之间的区别。 j
代表雅可比法,a
代表近似。
我想通过 cupy.linalg.svd
对矩阵堆栈执行 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,这更强大。
有没有一种方法可以有效地计算 cupy
中一堆矩阵的 SVD?
更好的是,有没有一种通用的方法可以有效地apply_along_axis
?
当前的 CuPy 实现调用 cusolverDn<t>gesvd()
,不支持批量计算。为了进行高效的批处理计算,我想 CuPy 必须调用接收批处理输入的 CUDA API。
仅供参考,以改进 CuPy,cuSOLVER 具有 cusolverDn<t>gesvdjBatched()
和 cusolverDn<t>gesvdaStridedBatched()
,它们似乎可用于批处理 SVD(密集一般矩阵)。我不知道 SVD 算法之间的区别。 j
代表雅可比法,a
代表近似。