将cupy.linalg.svd应用于一堆矩阵

时间:2019-04-04 13:17:29

标签: python cupy

我想通过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

1 个答案:

答案 0 :(得分:3)

CuPy的当前实现调用cusolverDn<t>gesvd(),该实现不支持批量计算。为了实现高效的批处理计算,我认为CuPy必须调用一个接收批处理输入的CUDA API。

FYI为改善CuPy,cuSOLVER具有cusolverDn<t>gesvdjBatched()cusolverDn<t>gesvdaStridedBatched(),似乎可以用于批处理SVD(密集型通用矩阵)。我对SVD算法之间的区别一无所知。 j代表Jacobi方法,a代表近似值。

相关问题