如何解决“索引超出数组元素的数量(6)”?

时间:2019-05-22 15:46:33

标签: matlab sorting indexing runtime-error minimum

我知道社区中也有类似的问题,但是我没有找到答案来理解我的问题。

我正在编写代码以对向量进行排序,而无需使用sort函数。但是MATLAB给出了一个错误消息:

  

索引超出了数组元素的数量(6); min = q(s);

这是我的代码:

q = [3, 1, -1, 4, 2, 0 ] %is my vector to order 
qRiserva = 0;       % is a variable to temporarily keep the element of q(s)
s = 1;              % is an index for outer 'for cycle'
min = q(s);
max = q(1);
i = 1;              % is an index for deeper 'for cycle'
for s = s :length(q)    
  for i = s: length(q)      
    if q(i) <= min        
      qRiserva = q(s)        
      min = q(i)     
      q(s) = min    
      q(i) = qRiserva    
    end     
  end    
  s = s+1;
  min = q(s); 
end  

我把min等于索引为q的向量s的元素,所以我不明白为什么MATLAB给我这个错误。

3 个答案:

答案 0 :(得分:1)

要排序,您想遍历除最后一个之外的所有元素,以便可以将这些元素与之后的所有元素进行比较。更改您的代码,如下所示:

q = [3, 1, -1, 4, 2, 0];
disp(q)
min = q(1);
for s = 1:length(q)-1
   for i = s+1:length(q)
      if q(i) <= min
         qRiserva = q(s);
         min = q(i);
         q(s) = min;
         q(i) = qRiserva;
      end
   end
   s = s+1;
   min = q(s);
end
disp(q)

因此,外循环遍历除最后一个元素之外的所有元素,而内循环遍历其余元素。原始代码循环了s:length(q),这意味着在某个时刻i==s,因此将一个元素与其自身进行了比较,并对其进行了交换。因此,我们在这里循环i=s+1:length(q)

但是您也不需要min

function so
q = [3, 1, -1, 4, 2, 0];
disp(q)
for s = 1:length(q)-1
   for i = s+1:length(q)
      if q(i) <= q(s)
         qRiserva = q(s);
         q(s) = q(i);
         q(i) = qRiserva;
      end
   end
end
disp(q)

最后,MATLAB有一个巧妙的技巧可以交换数组中的两个元素:

function so
q = [3, 1, -1, 4, 2, 0];
disp(q)
for s = 1:length(q)-1
   for i = s+1:length(q)
      if q(i) <= q(s)
         q([s,i]) = q([i,s]); % swap
      end
   end
end
disp(q)

答案 1 :(得分:0)

  • s == length(q)== 6,您应停止内部 循环
  • 如果将s加1,则它变成s = 6+1 = 7,当然还有 由于q(7)的长度为6
  • 而导致获取问题
  • 只需在内循环之后添加一个break

    q = [3, 1, -1, 4, 2, 0 ] %is my vector to order 
    qRiserva = 0;       % is a variable to temporarily keep the element of q(s)
    s = 1;              % is an index for outer 'for cycle'
    min = q(s);
    max = q(1);
    i = 1;              % is an index for deeper 'for cycle'
    for s = s :length(q)    
      for i = s: length(q)      
        if q(i) <= min        
          qRiserva = q(s)        
          min = q(i)     
          q(s) = min    
          q(i) = qRiserva    
        end     
      end 
      if s == length(q) 
        break;
      end  
      s = s+1;
      min = q(s); 
    end  
    

答案 2 :(得分:0)

  1. 正如High Performance Mark所指出的,您需要在循环中删除s = s+1;,因为它已经使每次循环迭代都递增。
  2. min = q(s);需要移动到循环的顶部,这样您就不需要在循环之前使用min = q(s);。实际上不需要min = q(s),您可以直接使用q(s),它更易于理解。
  3. s = 1;s = s :length(q)可以简化为s = 1 :length(q)
  4. 可以使用一个变量qRiserva(或作为Cris Luengo's answer,可以使用q([s,i]) = q([i,s]);)进行交换
  5. 第二个循环可以从s+1i = (s+1): length(q)开始,而firs循环可以以length(q)s = 1 :(length(q)-1)结尾,这避免了将元素与其自身进行比较。
  6. 避免使用minmax作为变量,它们是内置函数,您需要重新定义它们。

代码:

q = [3, 1, -1, 4, 2, 0 ] %is my vector to order
for s = 1 :(length(q)-1)
    for i = (s+1): length(q)
        if q(i) <= q(s)
            qRiserva = q(s);
            q(s) = q(i);               
            q(i) = qRiserva;
        end
    end
end

关于代码的另外一些注意事项: 代替