有谁知道什么是在 Android 中计算线性代数的好库(SVD、QR、LU、最小二乘、逆等)?
3 回答
传统的线性代数库是分层实现的。基本线性代数子程序(BLAS)位于底层。线性代数包 (LAPACK)建立在 BLAS 之上。这两个层库的接口早在 1990 年代就已标准化,硬件供应商通常会为其架构提供各种定制的实现。LAPACK 提供了你提到的线性代数库操作(SVD、QR、LU、最小二乘、逆等)。近年来,出现了一些对用户更友好的线性代数库(例如Armadillo、Eigen),它们实际上为传统的 BLAS 和 LAPACK 库提供了一些包装器。
JBLAS只是传统 BLAS 的 java 实现。JAMA也是一个用 Java 实现的类似 LAPACK 的库。这两个库实际上并不是针对 Android 的。但由于 Android 编程通常涉及 Java,我们可以让它们在 Android 上运行。但是,我们不能期望这些实现的性能。我的论点是性能是一个关键因素,因为您是在调用库而不是自己编写它,并且高性能通常会在使用 Android 操作系统的移动平台中提高低能耗成本。
虽然上述线性代数库通常针对 CPU(例如 x86 架构,操作系统:Linux/Windows/MacOS),但专家们现在正在取得进展,以便在移动平台(例如 ARM,操作系统:Android)上提供全栈支持。
我只是注意到高通刚刚发布了自己的类似 BLAS 的库Snapdragon Math Library,它可以运行在高通定制的 ARM 架构上。通过与它链接的顶级LAPACK,这些线性代数运算(SVD、QR、LU、最小二乘、逆等)可以在 Android 上以高性能实现。
最近,随着深度学习的快速发展,许多神经网络包如NNPACK开始流行。在底层,它们是线性代数库,具有神经网络中不同层的基元的低级高性能实现。
Jama工作得相当好。
如果您使用 C++ 和 NDK,则可以使用 Eigen。它可以使用 SSE 2/3/4、ARM NEON 和 AltiVec 指令集。