Как исправить «Индекс превышает количество элементов массива (6)»? - PullRequest
0 голосов
/ 22 мая 2019

Я знаю, что в сообществе есть похожие вопросы, но я не нашел ответа, чтобы понять мою проблему.

Я пишу код для сортировки вектора без использования функции 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 ]

1 голос
/ 22 мая 2019

Для сортировки вы хотите перебрать все элементы , кроме последнего , чтобы вы могли сравнить эти элементы со всеми элементами, которые идут после этого.Измените ваш код следующим образом:

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)
0 голосов
/ 22 мая 2019
  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 (или как * * * * * * * * * * * * * *), ответ , вы можете использовать q([s,i]) = q([i,s]);
  5. Второй цикл может начинаться с s+1: i = (s+1): length(q), а первый цикл может заканчиваться length(q): s = 1 :(length(q)-1), это позволяет избежать сравнения элемента с самим собой.
  6. Избегайте использования min и max в качестве переменных, они являются встроенными функциями, и вы переопределяете их.

Код:

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

Еще несколько примечаний к вашему коду: вместо

0 голосов
/ 22 мая 2019
  • При s == length(q)== 6 вы должны остановить вычисление ниже внутреннего цикла
  • , если вы добавите 1 к s, оно станет 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  
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...