这不是一个完整的示例(请参阅代码后的免责声明!)但它显示了一个想法......
您可以(至少在调试代码时)使用以下类代替零来分配原始变量。
随后使用超出原始分配大小范围的数据将导致“索引超出矩阵维度”。错误。
例如:
>> n = 3;
>> x = zeros_debug(n, 1)
x =
0
0
0
>> x(2) = 32
x =
0
32
0
>> x(5) = 3
Error using zeros_debug/subsasgn (line 42)
Index exceeds matrix dimensions.
>>
班级代码:
classdef zeros_debug < handle
properties (Hidden)
Data
end
methods
function obj = zeros_debug(M,N)
if nargin < 2
N = M;
end
obj.Data = zeros(M,N);
end
function sref = subsref(obj,s)
switch s(1).type
case '()'
if length(s)<2
% Note that obj.Data is passed to subsref
sref = builtin('subsref',obj.Data,s);
return
else
sref = builtin('subsref',obj,s);
end
otherwise,
error('zeros_debug:subsref',...
'Not a supported subscripted reference')
end
end
function obj = subsasgn(obj,s,val)
if isempty(s) && strcmp(class(val),'zeros_debug')
obj = zeros_debug(val.Data);
end
switch s(1).type
case '.'
obj = builtin('subsasgn',obj,s,val);
case '()'
if strcmp(class(val),'double')
switch length(s(1).subs{1})
case 1,
if s(1).subs{1} > length(obj.Data)
error('zeros_debug:subsasgn','Index exceeds matrix dimensions.');
end
case 2,
if s(1).subs{1} > size(obj.Data,1) || ...
s(1).subs{2} > size(obj.Data,2)
error('zeros_debug:subsasgn','Index exceeds matrix dimensions.');
end
end
snew = substruct('.','Data','()',s(1).subs(:));
obj = subsasgn(obj,snew,val);
end
otherwise,
error('zeros_debug:subsasgn',...
'Not a supported subscripted assignment')
end
end
function disp( obj )
disp(obj.Data);
end
end
end
会有相当大的性能影响(以及使用从句柄继承的类产生的问题),但它似乎是原始问题的一个有趣的解决方案。