【问题标题】:MATLAB array indexing error?MATLAB数组索引错误?
【发布时间】:2014-06-17 16:11:14
【问题描述】:

我一直在做数组索引如下

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

>> idx=1
idx =
     1

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

没有任何问题。 但是,今天我在下面的 sn-p 中遇到了这个错误。请原谅我。我知道我应该提供 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.
>> 

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

    这可能是因为赋值 node_idx = 1; 设置了值,并且在您的最后一个循环中,它永远不会增加产生 0 索引。

    【讨论】:

    • 谢谢,但3 3 2 是我做disp(node_idx) 时得到的。
    【解决方案2】:

    您的调试行的问题在于它仅在 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

    【讨论】:

      【解决方案3】:

      原来错误信息是由

      触发的
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-20
        • 2013-01-01
        • 2016-08-26
        • 2021-06-30
        • 2018-05-04
        • 2015-12-23
        相关资源
        最近更新 更多