我想通过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
只能计算单个2D矩阵的SVD。但是,numpy.linalg.svd
总是在数组的最后两个轴上计算SVD,这要强大得多。
是否可以通过cupy
中的矩阵堆栈有效地计算SVD?
更好的是,有没有一种通用的方法可以有效地apply_along_axis
?
答案 0 :(得分:3)
CuPy的当前实现调用cusolverDn<t>gesvd()
,该实现不支持批量计算。为了实现高效的批处理计算,我认为CuPy必须调用一个接收批处理输入的CUDA API。
FYI为改善CuPy,cuSOLVER具有cusolverDn<t>gesvdjBatched()
和cusolverDn<t>gesvdaStridedBatched()
,似乎可以用于批处理SVD(密集型通用矩阵)。我对SVD算法之间的区别一无所知。 j
代表Jacobi方法,a
代表近似值。