10

有谁知道什么是在 Android 中计算线性代数的好库(SVD、QR、LU、最小二乘、逆等)?

4

3 回答 3

12

传统的线性代数库是分层实现的。基本线性代数子程序(BLAS)位于底层。线性代数包 (LAPACK)建立在 BLAS 之上。这两个层库的接口早在 1990 年代就已标准化,硬件供应商通常会为其架构提供各种定制的实现。LAPACK 提供了你提到的线性代数库操作(SVD、QR、LU、最小二乘、逆等)。近年来,出现了一些对用户更友好的线性代数库(例如ArmadilloEigen),它们实际上为传统的 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开始流行。在底层,它们是线性代数库,具有神经网络中不同层的基元的低级高性能实现。

于 2015-12-18T21:18:21.397 回答
3

Jama工作得相当好。

于 2010-05-11T04:14:34.900 回答
0

如果您使用 C++ 和 NDK,则可以使用 Eigen。它可以使用 SSE 2/3/4、ARM NEON 和 AltiVec 指令集。

于 2013-09-10T17:37:37.467 回答