在一堆矩阵上应用 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代表近似。