我编写了一个代码来查找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," ";
Run Code Online (Sandbox Code Playgroud)
le不会做你认为它做的事情.http://perldoc.perl.org/perlop.html
如果左参数的字符串小于或等于右参数,则二进制"le"返回true.
print 10 le 9,"\n";
print 10 <= 9,"\n";
Run Code Online (Sandbox Code Playgroud)
这是一个字符串比较而不是数字比较.
这"10" le "9"是真的,因为按字母顺序排在前 10面9.
但这适用于较小的矩阵,因为它9 le 8是一种有效的比较并且以"正确的方式"运行.
您应该使用<=:
如果左参数在数值上小于或等于右参数,则二进制"<="返回true.
您也可以通过使用$#x1比较来自动缩放,这是最后一个数组索引的值.在上面的示例中,$#x1是9因为您的数组是0-9