我正在尝试在 Octave 中运行 Kevin Murphy 的 Bayes Net Toolbox,但遇到了一些问题。我是贝叶斯网络、Matlab 和 Octave 的新手,这于事无补。
这个工具箱最初是为 Matlab 编写的。有一个名为的大型测试文件test_BNT.m
贯穿工具箱中的所有功能。&
大多数错误消息与&&
Matlab 和 Octave之间的差异有关。这很容易解决。但是,我现在遇到了一个新问题,我不知道该怎么办。
例如,该qmr1.m
脚本创建一个pearl_inf_engine
类的实例,设置一些成员成员变量并将该类的实例传递给另一个函数。稍后,在不同的脚本 ( parallel_protocol.m
) 中再次访问成员变量。但发生这种情况时,会出现以下消息:
error: invalid index for class
error: evaluating argument list element number 1
似乎从一个脚本到另一个脚本,它忘记了该类有任何成员变量,并在您尝试访问它们时给出无效索引消息。
这是一个简单的解决方案的常见错误吗?路径或工作目录有问题吗?也许其他人已经将 BNT 转换为八度并知道该怎么做?
编辑
我能够通过此错误消息。诀窍是阅读安装说明(哈哈)并运行addpath(genpathKPM(<BNT base directory))
. genpathKPM.m
是一个包含在 BNT 中的脚本,它将所有必需的目录添加到路径中。
完成此操作后,在给出警告的每一行运行test_BNT.m
并更改&
to&&
和|
to 。||
这将清除大部分错误。
但是,我仍然无法运行mpe1.m
,mp2.m
和mildew1.m
其他一些。我坚持的新错误消息是:
error: invalid empty index list
error: called from:
error: C:\FullBNT-1.0.7\bnt\BNT\inference\static\@var_elim_inf_engine\find_mpe
.m at line 63, column 5
在这行代码上:
eval(['sCPT.T(', sargs, num2str(jj), ')=0;']);
如果我可以让所有脚本正常工作,我将在此处发布答案以及我采取的步骤。
编辑 2
我能够克服上一次编辑中的问题。代替
eval(['sCPT.T(', sargs, num2str(jj), ')=0;']);
和
eval(['sCPT.T(', sargs, sprintf('%d',jj), ')=0;']);
下一个问题是相同的。用同样的方法替换 num2str 即可。
该文件显然是由 BNT 的用户贡献的,而不是由原作者编写的。我认为,使用eval
一种 hack。更好的解决方法是重写代码,使其根本不使用eval
。
中还有一个错误draw_graph.m
,这显然也是对该项目的外部贡献。我只是注释掉了对该函数的调用,因为我现在对绘制图表不感兴趣。完成此操作并继续修复短路运算符后,test_BNT.m
将运行所有测试。
draw_graph.m
不过,在我也可以运行之前,我不会为此创建答案。