我试图在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.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
类型的黑客攻击。更好的解决方法是重写代码,使其根本不使用eval
。
draw_graph.m
还有一个错误,这显然也是该项目的外部贡献。我刚刚注释掉了对该函数的调用,因为我现在对绘制图形不感兴趣。执行此操作并继续修复短路操作符后,test_BNT.m
中的所有测试都将运行。
尽管如此,我还是不会为此创建答案,直到我可以让draw_graph.m
运行。
答案 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.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
如果我能让所有脚本都能运行,我会在这里发布一个答案 我采取的步骤。
修改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
中的测试将会运行。