недопустимое деление на ноль:Perl

Я написал код, чтобы найти определитель матрицы 10X10. Этот код дает правильный результат до матрицы 9X9. Но для матрицы 10х10 выдает следующую ошибку

«Использование неинициализированного значения при умножении ‹*> в строке 23

Недопустимое деление на ноль в строке 21"

Я также пытался использовать матрицу 11X11, но это дает неправильный ответ.

Почему этот код дает такую ​​ошибку...

Ниже приведен код:

#!/usr/bin/perl
use strict; 
use warnings;

my @x1=(
  [5, 6, 3, 2, 4, 9, 3, 5, 4, 2], 
  [12, 9, 8, 3, 3, 0, 6, 9, 3, 4],
  [8, 6, 5, 8, 9, 3, 9, 3, 9, 5],
  [6, 4, 3, 0, 6, 4, 8, 2, 22, 8],
  [8, 3, 2, 5, 2, 12, 7, 1, 6, 9],
  [5, 9, 3, 9, 5, 1, 3, 8, 4, 2],
  [3, 10, 4, 16, 4, 7, 2, 12, 9, 6],
  [2, 12, 9, 13, 8, 3, 1, 16, 0, 6],
  [3, 6, 8, 5, 12, 8, 4, 19, 8, 5],
  [2, 5, 6, 4, 9, 10, 3, 11, 7, 3]
);
# Matrix of nxn
for (my $i=0;$i le 9;$i++) {
  for (my $j=0;$j le 9;$j++) {

      if($j>$i) {
         my $ratio = $x1[$j][$i]/$x1[$i][$i];
          for(my $k = 0; $k le 9; $k++){

              $x1[$j][$k] -= $ratio * $x1[$i][$k];
          }
      } 

  }
}

my $det1 = 1; 
for(my $i = 0; $i le 9; $i++){
  $det1 *= $x1[$i][$i];
}
printf $det1," ";

person swapnil90    schedule 10.07.2015    source источник
comment
матрица 10x10, очевидно, нет элементов, к которым вы пытаетесь получить доступ. измените значение @x1, если хотите работать с матрицей, скажем, 11x11. и почему именно le 9, а не <=9?   -  person varnie    schedule 10.07.2015
comment
Вы используете операторы сравнения строк. $i le 9 верно для всех значений $i от 0 до 89. Вместо этого используйте $i <= 9.   -  person r3mainer    schedule 10.07.2015
comment
Да, я заменил le на ‹=, и все заработало. Спасибо за эту информацию.   -  person swapnil90    schedule 10.07.2015


Ответы (1)


le делает не то, что вы думаете. http://perldoc.perl.org/perlop.html

Двоичный "le" возвращает true, если левый аргумент меньше или равен правому аргументу.

print 10 le 9,"\n";
print 10 <= 9,"\n";

Это строковое сравнение, а не числовое.

Итак, "10" le "9" верно, потому что в алфавитном порядке 10 стоит перед 9.

Но это будет хорошо работать для меньшей матрицы, потому что 9 le 8 является допустимым сравнением и работает «правильным образом».

Вместо этого вы должны использовать <=:

Двоичный "‹=" возвращает true, если левый аргумент численно меньше или равен правому аргументу.

Вы также можете автоматически масштабировать, используя $#x1 для сравнения, что является значением последнего индекса массива. В приведенном выше примере $#x1 равно 9, потому что ваш массив равен 0-9.

person Sobrique    schedule 10.07.2015
comment
Да, теперь он работает нормально после ваших советов. Спасибо ! - person swapnil90; 10.07.2015
comment
См. это в отношении получения ответа, который решит вашу проблему: stackoverflow.com/help/someone-answers - person Sobrique; 10.07.2015