错误后,Matlab表索引失败

时间:2016-01-27 01:37:53

标签: matlab

我发现在抛出错误时表索引不起作用,这使调试变得困难。其他人发现相同的行为,和/或可以建议一种有效的方法来解决问题吗?

为了复制行为,我创建了两个简单的m文件:

% script.m
%---------
dbstop if error
func


% func.m
%-------
function func
y=table((1:4)','RowNames',{'a','b','c d','ef'})
y('zz',:) % Throws error to enter debugger
end % function func

然后我输入以下命令

script
dbup % Enter base workspace to create new variable y
y=table((1:4)','RowNames',{'a','b','c d','ef'})
y(1,1) % Returns whole table, not data within table

输出如下:

>> script
y = 
           Var1
           ____
    a      1   
    b      2   
    c d    3   
    ef     4   
Error using func (line 3)
Unrecognized row name 'zz'.
Error in script (line 1)
func 
65      throwAsCaller(ME)

K>> dbup % Enter base workspace to create new variable y
In workspace belonging to func (line 3)

K>> y=table((1:4)','RowNames',{'a','b','c d','ef'})
y = 
           Var1
           ____
    a      1   
    b      2   
    c d    3   
    ef     4   

K>> y(1,1) % Returns whole table, not data within table
ans = 
           Var1
           ____
    a      1   
    b      2   
    c d    3   
    ef     4   

可以看出,y(1,1)产生整个表而不是第1行第1列中的条目。

注意:在调试器模式下通常不会出现这种有问题的行为,但仅在出现错误后(即我想使用调试器时!)。为了查看预期的非问题行为,我在语句中设置了func.m中的断点:

y('zz',:)

对我而言是第3行,因为我没有任何开头的注释行:

dbquit
clear all
clear classes
dbstop in func at 3

然后我运行以下语句来获取表中的断点和索引:

script % Stops in func.m at statement y('zz',:)
y(1,1) % Now yields entry at row 1, column 1
dbup % See if new table in base workspace also behaves well
y=table((1:4)','RowNames',{'a','b','c d','ef'}) % New table
y(1,1) % Returns entry at row 1, column 1, as expected

我正在使用Matlab版本2015a。

P.S。使用行名称索引遇到了原始问题,但我把问题困扰到上面这个更简单的例子。

1 个答案:

答案 0 :(得分:0)

以下是TMW的解释:

在您的示例中,错误是在" subsref"中引发的。 Table类的方法。 " subsref" method是定义MATLAB中对象的下标引用或索引行为的方法。 MATLAB允许用户重载" subsref"为自定义类和对象定义自定义索引行为的方法。

就" subsref"而言对于重载版本的行为,文档中提到了以下信息(链接包含在下面):

" MATLAB不会调用类定义的' subsref'或者' subsasgn'重载方法中的方法。在类方法中,MATLAB总是调用内置的'subsref'和' subsasgn'功能"

"调用内置函数可以在定义专门的索引时使用默认的索引行为。"

http://www.mathworks.com/help/matlab/matlab_oop/indexed-reference-and-assignment.html#br09nsm

http://www.mathworks.com/help/matlab/ref/subsref.html#moreabout

现在,参考你的例子,因为错误是在" subsref" Table类的方法,它为调试过程中的以下步骤建立设置。使用" dbup"命令将工作空间移动到调用函数的工作空间,它允许您检查函数工作空间中的变量,以查看传递给抛出错误的函数的内容,并确定可能导致错误的函数这个问题。

然而,在你的例子中,我们仍然在技术上陷入表格的捕获部分" subsref"方法,由于错误索引引发的错误。如上所述,默认情况下,MATLAB不会调用类定义的" subsref" WITHIN中的方法是一个重载的" subsref"方法。我们在技术上仍然在表的重载方法中,因此任何索引都会在调试期间采用内置行为。这就是返回整个表格的原因;这是内置行为。在此调试过程中,用于表的正确索引是不可行的。

作为补充说明,此行为背后的部分动机是通过调用" subsref"来避免陷入无限循环。方法,通过索引,同时已在该方法内部。它不是自称,而是调用内置方法。