我想通过 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
不是二维的。显然,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
代表近似值。
关于python - 将 cupy.linalg.svd 应用于一堆矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55516973/