使用Octave中的matlab代码 - 贝叶斯网络工具箱

pea*_*ach 5 matlab octave

我试图在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跑步.

Den*_*din 2

由于已经过去了很长一段时间,并且问题中提供了核心问题的答案,我将其发布在这里,这样它就不会被列为未答复:

tl;dr:更改一些运算符,解决下面指定的剩余错误,除了绘制图形之外,一切正常。

编辑

我能够克服这个错误消息。诀窍是阅读安装说明(哈哈)并运行addpath(genpathKPM(<BNT base directory))genpathKPM.m是 BNT 中包含的脚本,它将所有必需的目录添加到路径中。

完成此操作后,运行并在发出警告的每一行test_BNT.m更改&&&|to 。||这将清除大部分错误。

但是,我仍然无法运行mpe1.mmp2.mmildew1.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;']); with

eval(['sCPT.T(', sargs, sprintf('%d',jj), ')=0;']);
Run Code Online (Sandbox Code Playgroud)

下一个问题是相同的。以同样的方式替换 num2str 即可。

该文件显然是由 BNT 用户贡献的,而不是由原作者编写的。我认为使用eval某种黑客手段。更好的解决方法是重写代码,使其eval根本不使用。

中还有一个错误draw_graph.m,这显然也是该项目的外部贡献。我只是注释掉了对该函数的调用,因为我现在对绘制图表不感兴趣。完成此操作并继续修复短路运算符后,所有测试都test_BNT.m将运行。