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.1numpy.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.4numpy.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 上播放声音,但在手机上播放

奇异矩阵

Android 小部件在模拟器中运行良好,但在手机上它变成了 Google App 小部件

推送通知正在发送到服务器,但没有出现在手机上

hbuilderX开发安卓app怎么在手机上播放视频

菜单没有出现在手机上?