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

标签 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不是二维的。显然,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/

相关文章:

python - 如何将数据框的一列放入 Python 中的泊松分布

java - Flink Python 自定义连接器/源代码

python - 我的 Pygame Flappy Bird 克隆中的管道出现滞后和摇晃,而不是流畅移动

numpy - 为什么 Python 和 CUDA 不支持半精度复数浮点运算?

python - 如何为 Windows 的 pyculib 添加正确的分发 channel ?

python - 如何使用 GPU 实现更快的 convolve2d

python - Django - 从外键获取数据

python - 如何解决/什么是 Python/Pandas 中的 KeyError?

python - 矢量化 numpy : check if point is inside sphere?

python - 将 CuPy CUDA 设备指针传递给 pybind11