0

BUG:我在底层函数中使用了元胞数组,糟糕!

我不明白为什么重新启动 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 的线路上失败。

如何获得有关错误的更多信息?或者我怎样才能进入递归算法的任何一点?-Linebreak 并试图进入该点只会引发错误。

4

3 回答 3

0

在您的递归算法上添加一个 try catch 块,打印您认为有效的信息,然后重新抛出一个错误,该错误将静默终止您的其他回调。

随着递归函数的进行,您可以使用键盘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
于 2013-08-20T20:37:44.237 回答
0

在运行dbstop if error代码之前运行,以准确地在错误点放置到调试器。从那里你可以检查变量,包括你携带的任何变量来识别关卡。您还可以运行dbstack以查看完整的调用堆栈。

于 2013-08-20T21:46:05.370 回答
0

在错误的描述中并不明显,因为它没有显示我使用哪些工具对底层函数进行了编程:我使用了 cellarrays,由于某种原因,Matlab 使用 cellarrays 返回的错误消息比使用 Matrices 的错误消息要糟糕得多,所以:

我真正的建议是避免使用单元数组并使用矩阵——如果你需要处理很多零情况,请使用现成的稀疏功能,因为它们具有更好的调试冗长性!

与其浪费太多时间进行调试,不如选择正确的工具,Matlab 非常适合矩阵,您可以从错误消息的质量中看到它。

于 2013-11-09T21:13:54.577 回答