Lightspeed breaks Octave Forge软件包安装-二进制运算符'==';未实施

Lightspeed breaks Octave Forge软件包安装-二进制运算符'==';未实施,octave,Octave,尝试安装Octave软件包时出现以下错误: binary operator '==' not implemented for 'cell' by 'scalar' operations error: called from glob at line 62 column 1 install at line 60 column 11 pkg at line 437 column 9 无论我是从本地下载还是从Forge安装,这都会发生在多个软件包中—例如struct和opti

尝试安装Octave软件包时出现以下错误:

binary operator '==' not implemented for 'cell' by 'scalar' operations
error: called from
    glob at line 62 column 1
    install at line 60 column 11
    pkg at line 437 column 9
无论我是从本地下载还是从Forge安装,这都会发生在多个软件包中—例如struct和optim


请注意,如果我加载(版本2.8),则会发生这种情况,它将替换内置的
glob
函数。

我无法在我的机器上对此进行广泛测试,但LightSpeed“toolkit”似乎只不过是一组“文件”(尽管需要初始编译)

将此集合添加到路径会使其对matlab中不存在的核心倍频程函数(
glob
)产生阴影

一种解决方法是创建一个名称空间,也就是说,不要直接将有问题的项添加到路径中,而是将它们环绕在一个文件夹中,在名称前面加一个加号(“+”),然后将其添加到路径中。然后可以调用该名称空间限定的所有Lightspeed函数,例如“Lightspeed.digamma”

理论上,这应该是可行的;这取决于具体的实现,他们如何理智地处理相关引用等,但在理论上应该是好的

或者,您可以稍微修改Lightspeed代码,并将所有出现的
glob
替换为
Lglob
或类似的内容

或者,正如Cris所建议的,您可以尝试从路径中删除Lightspeed,并仅在需要使用其功能时加载它(或在执行Lightspeed相关操作之前将
cd
加载到其文件夹)

正如评论中所指出的,这是值得作为一个bug提出来的,包括Lightspeed1和八度音阶



1:虽然Lightspeed可能只会说他们不支持倍频程,欢迎您自己尝试修复代码

问题是什么?您的问题的明显解决方案是不安装Lightspeed toolkit,或者在安装软件包时将其从路径中删除。除此之外,在Lightspeed toolkit GitHub页面上提交一份bug报告。虽然工具箱是为MATLAB设计的,不是为倍频程设计的。@CrisLuengo我同意,但一般原则是,如果一个“模块”破坏了一个“环境”,那就是环境的故障,需要修复。因此,这也是值得向Octave报告的一个Octave错误,在他们的代码库中将
glob
替换为
builtin('glob')
。(尽管如此,不能保证Lightspeed即使在那时也能与Octave兼容,但那是另一回事)@TasosPapastylianou非常不同意“一般原则是,如果一个‘模块’破坏了一个‘环境’,那就是环境的错”。在这种情况下,环境就是语言,支持隐藏核心功能(例如,nan包就是这样工作的)这是一个需要小心的模块,确保如果你对函数进行阴影处理,它们会保留它们的签名。但我不明白“一般原则”在哪里“在一般情况下完全适用。尽管我的问题显然有点混乱和垃圾,但得到这么多的回答还是让人惊喜不已。很明显,Octave有一个强大的社区2。我误用了“工具箱”,Lightspeed只是一些ML研究人员使用的一个库,我真的不认为GNU八度音程中有缺陷。重载是语言设计的一部分。如果我写的插件/库覆盖了你的脚本使用的函数,你真的会说问题出在你的脚本中,而不是我的“buggy重载函数”吗?@Andy请加入上面的“讨论”,你同意Carandraug(在整个范围内我都不反对)。也许这将是在octave邮件列表中进行的有用讨论。+1对于
+Lightspeed
名称空间建议。我认为这是所有Matlab库的良好实践,无论它们是否关心倍频程兼容性:它不仅避免了与内置Matlab/Octave函数的冲突,还避免了与可能在其他用户创建的库中定义的函数的冲突,Lightspeed无法提前知道这些函数的名称。但是,这需要在库级别完成:在Matlab中,所有带名称空间的函数都必须在任何地方显式限定,即使从同一名称空间中的函数调用也是如此