1

我想通过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,这要强大得多。


有没有一种方法可以有效地计算 SVD 中的一堆矩阵cupy

更好的是,有没有一种有效的通用方法apply_along_axis

4

1 回答 1

3

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

仅供参考,以改进 CuPy,cuSOLVER 具有cusolverDn<t>gesvdjBatched()cusolverDn<t>gesvdaStridedBatched(),这似乎可用于批量 SVD(密集的一般矩阵)。我不知道 SVD 算法之间的区别。 j代表 Jacobi 方法,a代表近似。

于 2019-04-05T04:57:20.883 回答