Kivy App 在手机上出现“奇异矩阵”错误,但在电脑上却没有
Posted
技术标签:
【中文标题】Kivy App 在手机上出现“奇异矩阵”错误,但在电脑上却没有【英文标题】:Kivy App gives "Singular Matrix" error on phone, but not on computer 【发布时间】:2020-12-15 01:17:58 【问题描述】:我在自己编写的 Kivy 应用程序中遇到了一个问题,我在网上的任何地方都没有找到任何帮助将不胜感激。
问题如下。我的代码涉及 numpy 矩阵求逆,当我在计算机上运行它时工作得非常好。但是,当我在 XCode 中的模拟 iPhone 或我的个人手机上运行它时,我会收到 LinAlgError("Singular matrix") numpy.linalg.LinAlgError: Singular matrix
错误,即使所讨论的矩阵绝对不是单数。
编辑:
在电脑上:
Numpy 版本:1.19.1
numpy.show_config()
的输出:
blas_mkl_info:
NOT AVAILABLE
blis_info:
NOT AVAILABLE
openblas_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
blas_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
lapack_mkl_info:
NOT AVAILABLE
openblas_lapack_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
在模拟手机上:
Numpy 版本:1.16.4
numpy.show_config()
的输出:
lapack_mkl_info:
NOT AVAILABLE
openblas_lapack_info:
NOT AVAILABLE
openblas_clapack_info:
NOT AVAILABLE
atlas_3_10_threads_info:
NOT AVAILABLE
atlas_3_10_info:
NOT AVAILABLE
atlas_threads_info:
NOT AVAILABLE
atlas_info:
NOT AVAILABLE
accelerate_info:
extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
lapack_opt_info:
extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
【问题讨论】:
对 numpy.linalg 和 kivy-ios 的进一步实验似乎表明,在使用工具链创建应用程序后,thst linalg 似乎根本不起作用。即使计算良性 2x2 矩阵的行列式也会得到完全错误的结果...... 什么 numpy 版本?numpy.show_config()
在手机上和电脑上的作用是什么?
我已编辑问题以包含您要求的信息
【参考方案1】:
您的问题的原因几乎可以肯定是链接器参数中的-Wl,Accelerate
。 Accelerate 附带了一个非常旧且有些损坏的 LAPACK 版本,这就是为什么从 https://github.com/numpy/numpy/pull/15759(未发布的 1.20)开始不再支持它。
如果您可以在环境变量中设置 ATLAS=None BLAS=None LAPACK=None
来重建 kivy 的 numpy,那么您最终将没有这个 Accelerate 依赖项。
您可能需要从 https://github.com/kivy/python-for-android/blob/develop/pythonforandroid/recipes/numpy/__init__.py 开始四处挖掘,才能弄清楚如何将其传递给 kivy。
【讨论】:
谢谢!我在哪里以及如何设置环境变量?我只是从 Kivy 开始。ATLAS=None BLAS=None LAPACK=None
选项在 toolchain build ...
中吗?
如果你幸运的话,你可以直接使用ATLAS=None BLAS=None LAPACK=None toolchain build ...
。我从来没有用过 kivy,所以你可能在他们的问题跟踪器上运气更好。
但是旧版本的 numpy.linalg 是否有可能那么糟糕?在上面的例子中,基本上不可能找到任何 numpy.linalg.det() 没有给出完全废话的矩阵......
我不能代表det
,但是在一个例程中存在一个错误,当您询问“此操作将占用多少工作内存”时,lapack 会返回废话。 Accelerate 固定在 lapack 3.2.1 上,因此您可以查看 lapack 更改日志以找出从那时起修复了哪些错误。以上是关于Kivy App 在手机上出现“奇异矩阵”错误,但在电脑上却没有的主要内容,如果未能解决你的问题,请参考以下文章
MediaPlayerElement 不在 PC 上播放声音,但在手机上播放