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

时间:2013-11-07 16:02:05

标签: matlab octave

我试图在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并将&更改为&&并将|更改为||,并在其发出警告的每一行。这将清除大部分错误。

但是,我仍然无法投放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

在这行代码上:

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类型的黑客攻击。更好的解决方法是重写代码,使其根本不使用eval

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

尽管如此,我还是不会为此创建答案,直到我可以让draw_graph.m运行。

1 个答案:

答案 0 :(得分:0)

由于大量时间过去了,问题中提供了核心问题的答案,我将在此处发布,以便不会将其列为未答复:

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

  

修改

     

我能够通过此错误消息。诀窍是阅读   安装说明(哈哈)并运行import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; public class Question { //String question = new String() ; String s = new String(); Question() { try{ File file = new File("C:\\Users\\Username\\Documents\\levels.xml"); JAXBContext jaxbContext = JAXBContext.newInstance(s); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); String string = (String) jaxbUnmarshaller.unmarshal(file); System.out.println(string); } catch(JAXBException e){ e.printStackTrace(); } }} addpath(genpathKPM(<BNT base directory))是BNT中添加的脚本   路径的所有必需目录。

     

执行此操作后,运行genpathKPM.m并将test_BNT.m更改为&&&   |在每条线路上发出警告。这将清除大部分   错误。

     

但是,我仍然无法投放||mpe1.mmp2.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
     

如果我能让所有脚本都能运行,我会在这里发布一个答案   我采取的步骤。

     

修改2

     

我能够在上一次编辑中解决问题。取代

eval(['sCPT.T(', sargs, num2str(jj), ')=0;']);
     

下一个问题是完全相同的。只需以相同的方式替换num2str。

     

这个文件显然是由BNT的用户提供的,而不是写的   由原作者。我认为使用eval(['sCPT.T(', sargs, num2str(jj), ')=0;']); with eval(['sCPT.T(', sargs, sprintf('%d',jj), ')=0;']); 类型的黑客攻击。一个更好的   修复只是重写代码,因此它根本不使用eval

     

eval还有一个错误,显然也是如此   对项目的外部贡献。我只是评论了这个电话   由于我现在对绘制图表不感兴趣,所以对该功能。   在这之后,继续修复短路操作员,全部   draw_graph.m中的测试将会运行。