我发现在抛出错误时表索引不起作用,这使调试变得困难。其他人发现相同的行为,和/或可以建议一种有效的方法来解决问题吗?
为了复制行为,我创建了两个简单的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。使用行名称索引遇到了原始问题,但我把问题困扰到上面这个更简单的例子。
答案 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"来避免陷入无限循环。方法,通过索引,同时已在该方法内部。它不是自称,而是调用内置方法。