有谁知道什么是Android中计算线性代数的好库(SVD,QR,LU,最小二乘,反转等)?
答案 0 :(得分:9)
传统的线性代数库是分层实现的。 Basic Linear Algebra Subprogram (BLAS)位于底层。 Linear Algebra Package (LAPACK)建立在BLAS之上。这两个层库的接口在20世纪90年代被标准化,硬件供应商通常会为其架构提供各种定制的实现。 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,OS:Android)上提供完整的堆栈支持。
我只是注意到Qualcomm刚刚发布了自己的类似BLAS的库Snapdragon Math Library,它可以在Qualcomm定制的ARM架构上运行。顶级LAPACK链接到它,这些线性代数操作(SVD,QR,LU,最小二乘,反转等)可以在Android上以高性能实现。
最近,随着深度学习的快速发展,许多神经网络包如NNPACK变得流行起来。在引擎盖下,它们是线性代数库,具有神经网络中不同层的基元的低级高性能实现。
答案 1 :(得分:3)
Jama运作得相当好。
答案 2 :(得分:0)
如果您使用C ++和NDK,则可以使用Eigen。它可以使用SSE 2/3/4,ARM NEON和AltiVec指令集。