2013-08-20 158 views
0

错误:我在底层函数中使用了单元阵列,不好!在Matlab中使用递归算法更详细的错误消息?

我不明白为什么重新启动Matlab的结果有时会变成更详细的错误消息,这些消息帮助我实际解决问题。现在我试图找到一个让Matlab尽可能多地显示信息的命令。例如,下面的index-exceed-dimension错误对于我的递归算法是完全没有用的 - 这是Matlab已经发现特定行的特定算法,但现在由于某种原因只能真实地告诉算法的名称

Index exceeds matrix dimensions. 

Error in Dij (line 65) 
     Dij_=Dij(ii,jj,[II,k],[r,q_(k)]); 

在这里你可以看到,我正在运行算法Dij失败,再次运行算法Dij。

如何获得有关错误的更多信息?或者我怎么能进入递归算法的任何一点?分离并试图进入这一点只是引发错误。

+1

使用'dbstop if error':http://stackoverflow.com/a/3010636/97160 – Amro

+0

你应该给出更多关于“重新启动MATLAB”的细节。在开始下一次运行之前,您的代码是否指向现有变量并未能清除它?再试一次解释你的确切问题,也许用一个代码示例? – Peter

+0

@hhh你不需要更多的错误信息。这个信息对我来说很清楚。你有数据结构的问题。您正在尝试使用**(2^m-1)x 1 double **或类似的数据结构作为函数** Dij **中的输入,该函数接受**伽罗瓦向量**的输入。这可能也太长。长度最多可以是** 2^m - 1 **并且通常在** m = 8 **时。 –

回答

0

这不是在错误是因为它并没有显示与工具,我编程的基本功能的描述显而易见的:我用cellarrays出于某种原因,Matlab的返回与cellarrays差远了错误信息比矩阵这样:

我真正的建议是避免cellarrays和使用矩阵 - 如果你需要大量的零的情况下打球,使用现成稀疏的功能,因为他们有更好的调试详细!

与其浪费太多的时间来调试的,选择合适的工具和Matlab同样非常出色,矩阵,你可以看到它在错误信息的质量。

0

在您的递归算法中添加一个try catch块,打印出您认为有效的信息,然后重新抛出一个错误,以便无声地终止其他回调。

您可以使用keyboard matlab函数检查matlab工作区,因为递归函数会继续执行。您可以选择在错误消息之前添加它,所以每当它在递归级别更深入时都会调用它,以便您可以检查发生了什么,或者可以在出现错误时添加它(在catch )。

这只是一个草案,它可能包含错误,它改编成你的需求:

try 
    % recursive routine 
catch ext 
    if strcmp(ext.identifier,'MyPackage:MyRecursiveRoutine:TerminateSilently')) 
    % Do nothing 
    else 
    % Display useful information, you edit it to add information you think would be valid, i.e.: 
    disp(ext.getReport) 
    disp(yourVariable) 
    % get dbstack size, to see how many recursive functions, i.e: 
    theStack = dbstack; 
    recursiveCalls=sum(strcmp({theStack.name},'MyRecursiveFcnName')) 
    % You may even add the keyboard function here, so that you can inspect your workspace: 
    keyboard 
    throw(MExcept('MyPackage:MyRecursiveRoutine:TerminateSilently','')); 
    end 
end 
0

运行dbstop if error运行代码下降到调试器正好在错误点之前。从那里你可以检查变量,包括你携带的任何变量来确定等级。您还可以运行dbstack以查看完整的调用堆栈。

+0

不幸的是,我不明白'dbstop if error'和'bstack'在这里可以提供帮助。我只能看到我已经知道的信息'K >> dbstack > Dij在65 D在15 在68'的test_atj_7_case_3_matrix。 Matlab有一些命令可以深入挖掘这一点吗?如果我可以在离开调试器的地方执行'Dij(5,6,[],[])'',我会解决我的问题。 – hhh

+0

你想要什么信息?你有一个行号,你可以访问变量,所以你可以找出哪一个是越界,你有完整的调用堆栈,所以你知道你有什么深度的递归。如果您需要更多信息,请将其作为另一个参数传递给您的函数,然后您将可以访问它。 – Peter

相关问题