我试图在Octave中运行Kevin Murphy的Bayes Net Toolbox并遇到一些问题.我对贝叶斯网络,Matlab和Octave的新手没有帮助.
这个工具箱最初是为Matlab编写的.有一个大型测试文件test_BNT.m,它通过工具箱中的所有功能运行.大部分的错误消息与之间的差异&,并&&在Matlab和倍频.这很容易解决.但是,我现在遇到了一个新问题,我不知道该怎么做.
例如,qmr1.m脚本创建pearl_inf_engine类的实例,设置一些成员成员变量并将类的实例传递给另一个函数.稍后,将在另一个脚本(parallel_protocol.m)中再次访问成员变量.但是当发生这种情况时,会出现以下消息:
error: invalid index for class
error: evaluating argument list element number 1
Run Code Online (Sandbox Code Playgroud)
似乎从一个脚本到另一个脚本,它忘记了该类有任何成员变量,并在您尝试访问它们时给出无效的索引消息.
这是一个容易解决的常见错误吗?路径或工作目录有问题吗?也许其他人已经将BNT转换为八度,知道该怎么做?
编辑
我能够通过此错误消息.诀窍是阅读安装说明(哈哈)并运行addpath(genpathKPM(<BNT base directory)).genpathKPM.m是BNT中包含的脚本,它将所有必需的目录添加到路径中.
这样做了以后,运行test_BNT.m和变化&,以&&和|到||每个地方,它提供了警戒线.这将清除大部分错误.
但是,我仍然无法运行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
Run Code Online (Sandbox Code Playgroud)
在这行代码上:
eval(['sCPT.T(', sargs, num2str(jj), ')=0;']);
Run Code Online (Sandbox Code Playgroud)
如果我可以让所有脚本都能运行,我会在这里发布一个答案,并按照我的步骤进行操作.
编辑2
我能够在上一次编辑中解决问题.更换
eval(['sCPT.T(', sargs, num2str(jj), ')=0;']);
Run Code Online (Sandbox Code Playgroud)
同
eval(['sCPT.T(', sargs, sprintf('%d',jj), ')=0;']);
Run Code Online (Sandbox Code Playgroud)
下一个问题是完全相同的.只需以相同的方式替换num2str.
此文件显然是由BNT的用户提供的,而不是由原作者编写的.eval我想,使用一种黑客攻击.更好的解决方法是重写代码,使其根本不使用eval.
还有一个错误draw_graph.m,显然也是对项目的外部贡献.我刚刚注释掉了对该函数的调用,因为我现在对绘制图形不感兴趣.在完成此操作并继续修复短路操作符后,所有测试都test_BNT.m将运行.
尽管如此,我还是不会为此做出答案,直到我能够draw_graph.m跑步.
由于已经过去了很长一段时间,并且问题中提供了核心问题的答案,我将其发布在这里,这样它就不会被列为未答复:
tl;dr:更改一些运算符,解决下面指定的剩余错误,除了绘制图形之外,一切正常。
编辑
我能够克服这个错误消息。诀窍是阅读安装说明(哈哈)并运行
addpath(genpathKPM(<BNT base directory))。genpathKPM.m是 BNT 中包含的脚本,它将所有必需的目录添加到路径中。完成此操作后,运行并在发出警告的每一行
test_BNT.m更改&为&&和|to 。||这将清除大部分错误。但是,我仍然无法运行
mpe1.m、mp2.m和mildew1.m其他一些程序。我遇到的新错误消息是:Run Code Online (Sandbox Code Playgroud)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在这行代码上:
Run Code Online (Sandbox Code Playgroud)eval(['sCPT.T(', sargs, num2str(jj), ')=0;']);如果我能让所有脚本正常工作,我将在此处发布答案以及我采取的步骤。
编辑2
我在之前的编辑中解决了这个问题。代替
Run Code Online (Sandbox Code Playgroud)eval(['sCPT.T(', sargs, num2str(jj), ')=0;']); with eval(['sCPT.T(', sargs, sprintf('%d',jj), ')=0;']);下一个问题是相同的。以同样的方式替换 num2str 即可。
该文件显然是由 BNT 用户贡献的,而不是由原作者编写的。我认为使用
eval某种黑客手段。更好的解决方法是重写代码,使其eval根本不使用。中还有一个错误
draw_graph.m,这显然也是该项目的外部贡献。我只是注释掉了对该函数的调用,因为我现在对绘制图表不感兴趣。完成此操作并继续修复短路运算符后,所有测试都test_BNT.m将运行。