iPhone上的线性代数(python/numpy?)
这个学期,我正在开发一个压缩感知算法的iPhone应用。为了实现这个目标,我需要一些好的矩阵和线性代数库。我对iOS和Python都还比较陌生,所以想请教一下如何评估我的选择。
我知道iPhone有一个叫做Accelerate的框架,其中包含了vecLib、BLAS和LAPACK,但我对它们的接口不太熟悉(看起来也挺复杂的)。
我试过使用Python的numpy,觉得它非常简单易用。如果可以选择的话,我更倾向于使用numpy而不是Accelerate。
我知道可以嵌入Python,但我自己尝试过几次都没成功。我试着把Enthought的EPD.framework放进XCode项目里,但折腾了一个小时也没搞定。我想编译numpy可能会更麻烦。
作为另一种选择,我可以使用Cython(http://cython.org/)生成C文件,然后调用里面的函数吗?我也尝试过这个,但在包含.so库和调用它时遇到了更多问题。有没有办法让Cython生成.c和.h文件?这些文件还会依赖numpy吗?
我看过一些关于PyInstaller和freeze.py的资料。这两者能帮到我吗?
除了Accelerate或Python+numpy,还有其他选择吗?Python+numpy是个好选择吗,还是编译/build会很困难?Cython是个有效的解决方案吗?
谢谢!
4 个回答
随着Swift的发布,以及它对Accelerate框架的支持,想要在iOS上运行Python的理由已经不多了。只要使用合适的框架,你可以用Swift编写高层次且高效的代码,语法类似于Python/numpy,而且性能会比在iOS上运行numpy要好得多。
正如其他人已经提到的,有很多库试图“封装”Accelerate框架,以提供高性能和易用的接口。作为另一个答案中提到的swix库的替代,我在使用Upsurge框架时取得了很好的效果。对于你可能会用到的操作,Upsurge可能已经包含了你需要的所有功能。
它提供了一个简单且详细的接口,可以访问多种Accelerate函数,比如矩阵运算、卷积、快速傅里叶变换(FFT)、线性代数、数学运算等等。它还支持在自己定义的张量类型上进行很多这些操作。我在选择这两个框架时发现的一个大优势是,Upsurge不依赖于OpenCV,也不需要任何桥接头文件(它是用纯Swift编写的),这让我在调试时更轻松。
不过,两个框架都很棒,任意一个都能满足你的需求。我建议你都看看,看看哪个更适合你。
花点时间去了解Accelerate命令。如果你在做复杂的数学运算,这些函数就是你需要使用的。它们运行得更快,而且将来更有可能继续得到支持和优化,适应新的硬件。此外,它们比简单的解决方案消耗更少的能量。