非法划分为零:Perl

时间:2015-07-10 09:27:06

标签: perl matrix

我编写了一个代码来查找10X10矩阵的行列式。该代码给出了直到9X9矩阵的正确结果。但对于10X10矩阵,会出现以下错误

"在乘法中使用未初始化的值< *>在第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," ";

1 个答案:

答案 0 :(得分:6)

le并不能按照您的想法行事。 http://perldoc.perl.org/perlop.html

  

Binary" le"如果左参数stringwise小于或等于右参数,则返回true。

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

它是一个字符串比较不是一个数字的比较。

所以"10" le "9"是正确的,因为按字母顺序 109之前。

但是这对于较小的矩阵可以正常工作,因为9 le 8是有效的比较并且正确地运行&#39;。

您应该使用<=代替:

  

Binary&#34;&lt; =&#34;如果左参数在数值上小于或等于右参数,则返回true。

您也可以使用$#x1进行自动缩放比较,这是最后一个数组索引的值。在上面的示例中,$#x19,因为您的数组是0-9