2014-06-17 76 views
0

我一直在做数组索引如下MATLAB数组索引错误?

>> n=[1 2 3] 
n = 
    1  2  3 

>> idx=1 
idx = 
    1 

>> n([idx+1 idx]) 
ans = 
    2  1 

没有任何问题。但是,今天我在我的下面的代码片段中遇到了这个错误。请原谅我。我明白我应该提供MWE,但我根本无法重现错误!

>> %%% interpret tree 
bitmap = zeros(pix_no_per_side, pix_no_per_side); 
x_pixels = 1:1:pix_no_per_side; 
y_pixels = 1:1:pix_no_per_side; 
rule_set = {}; % cell to accommodate rows of diff. sizes 
% parse branches 
trav_iter = tr.depthfirstiterator; 
while tr.get(trav_iter(end)) <= 0 % still have branch unparsed 
    branch = [1]; % contains the root 
    node_idx = 1; 
    while tr.get(branch(end)) > 0 % not bottom yet 
     node_idx = node_idx+1; 
     branch = [branch trav_iter(node_idx)]; 
    end 
    rule_set{end+1} = branch; % one rule per cell 
    disp(node_idx) % DISPLAYING FOR DEBUGGING 
    if numel(rule_set) == 1 % only one branch found so far 
     trav_iter(node_idx) = []; % remove this leaf 
    else % more than one branches found so far 
     trav_iter([node_idx-1 node_idx]) = []; % remove this leaf and parent node 
    end 
end 
    3 

    3 

    2 

Subscript indices must either be real positive integers or logicals. 
>> 

回答

0

事实证明,错误消息是由

trav_iter(end) 

其中trav_iter是可能是空的触发。

重现错误然后变成。

>> a = [] 

a = 

    [] 

>> a(end) 
Subscript indices must either be real positive integers or logicals. 

因此,要解决这个问题,我想补充一个逻辑,并确保该trav_iter不是空的。即

while numel(trav_iter) ~= 0 && tr.get(trav_iter(end)) <= 0 
2

索引node_idx-1可能要么0-1。下标错误几乎总是表明这个问题。但是,任何空的,NaN或其他值也可能导致这种情况。

也许这是因为分配node_idx = 1;设定值,并在最后一个循环,这是从来没有递增产生一个0指数。

+0

谢谢,但'3 3 2'是我在执行'disp(node_idx)'时得到的结果。 –

0

调试行的问题在于,它仅在while循环结束时显示node_idx的输出。如果它在将node_idx设置为1之后并且在碰到disp之前发生错误,那么您将看不到导致错误的索引值。

这里是了解它的简单方法:

x = 1:3 

for n = 3:-1:0 
    y = x(n); 
    disp(n) 
end 

正如你可能已经猜到,当n到达0, 但是,当它运行在上面的代码会出错,我得到:

 3 

    2 

    1 

Attempted to access x(0); index must be a positive integer or logical. 

disp从未显示0

但是从命令行:

>> n 

n = 

    0 

如果这是一个函数中,使用dbstop if error然后检查node_idx代码停止时。