iPhone上的线性代数(python/numpy?)

10 投票
4 回答
4262 浏览
提问于 2025-04-17 10:14

这个学期,我正在开发一个压缩感知算法的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 个回答

2

随着Swift的发布,以及它对Accelerate框架的支持,想要在iOS上运行Python的理由已经不多了。只要使用合适的框架,你可以用Swift编写高层次且高效的代码,语法类似于Python/numpy,而且性能会比在iOS上运行numpy要好得多。

正如其他人已经提到的,有很多库试图“封装”Accelerate框架,以提供高性能和易用的接口。作为另一个答案中提到的swix库的替代,我在使用Upsurge框架时取得了很好的效果。对于你可能会用到的操作,Upsurge可能已经包含了你需要的所有功能。

它提供了一个简单且详细的接口,可以访问多种Accelerate函数,比如矩阵运算、卷积、快速傅里叶变换(FFT)、线性代数、数学运算等等。它还支持在自己定义的张量类型上进行很多这些操作。我在选择这两个框架时发现的一个大优势是,Upsurge不依赖于OpenCV,也不需要任何桥接头文件(它是用纯Swift编写的),这让我在调试时更轻松。

不过,两个框架都很棒,任意一个都能满足你的需求。我建议你都看看,看看哪个更适合你。

3

花点时间去了解Accelerate命令。如果你在做复杂的数学运算,这些函数就是你需要使用的。它们运行得更快,而且将来更有可能继续得到支持和优化,适应新的硬件。此外,它们比简单的解决方案消耗更少的能量。

3

最新发布的Swift编程语言与iOS 8结合,可以让我们写出类似Python或Matlab那样高级的代码。因此,开发了一个叫做swix的框架,它封装了Accelerate(/BLAS/Lapack等)框架。

下面是一个充分利用Accelerate框架的代码示例:

var N = 10
var x = ones(N) * pi
var y = ones(N) * phi
var result = (x+y+4)*x

这段代码可以编译用于iPhone/iOS。关于安装的详细信息,可以查看swix的文档

撰写回答