pembagian ilegal dengan nol:Perl

Saya telah menulis kode untuk mencari determinan matriks 10X10. Kode ini memberikan hasil yang tepat hingga matriks 9X9. Namun untuk matriks 10X10 memberikan error berikut

"Penggunaan nilai yang tidak diinisialisasi dalam perkalian ‹*> pada baris 23

Pembagian ilegal dengan nol pada baris 21"

Saya juga mencoba matriks 11X11, tetapi memberikan jawaban yang salah.

Mengapa kode ini memberikan kesalahan seperti itu...

Berikut kodenya:

#!/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 sumber
comment
matriksnya 10x10, jelas, tidak ada item yang Anda coba akses. ubah nilai @x1 Anda jika Anda ingin bekerja dengan matriks, katakanlah, 11x11. dan, kenapa le 9, tapi bukan <=9?   -  person varnie    schedule 10.07.2015
comment
Anda menggunakan operator perbandingan string. $i le 9 berlaku untuk semua nilai $i dari 0 hingga 89. Gunakan $i <= 9 sebagai gantinya.   -  person r3mainer    schedule 10.07.2015
comment
Ya, saya mengganti le dengan ‹=, dan berhasil. Terima kasih atas informasi ini.   -  person swapnil90    schedule 10.07.2015


Jawaban (1)


le tidak melakukan apa yang Anda pikirkan. http://perldoc.perl.org/perlop.html

Biner "le" menghasilkan nilai benar jika argumen kiri bernilai lebih kecil atau sama dengan argumen kanan.

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

Ini adalah perbandingan berdasarkan string bukan numerik.

Jadi "10" le "9" benar, karena menurut abjad 10 sebelum 9.

Namun ini akan berfungsi dengan baik untuk matriks yang lebih kecil, karena 9 le 8 merupakan perbandingan yang valid dan berfungsi dengan 'cara yang benar'.

Anda sebaiknya menggunakan <= sebagai gantinya:

Biner "‹=" mengembalikan nilai benar jika argumen kiri secara numerik kurang dari atau sama dengan argumen kanan.

Anda mungkin juga dapat melakukan penskalaan otomatis dengan menggunakan $#x1 untuk perbandingan Anda, yang merupakan nilai indeks array terakhir. Dalam contoh Anda di atas, $#x1 adalah 9, karena array Anda adalah 0-9

person Sobrique    schedule 10.07.2015
comment
Ya, sekarang berfungsi dengan baik setelah saran Anda. Terima kasih ! - person swapnil90; 10.07.2015
comment
Silakan lihat ini mengenai mendapatkan jawaban yang memecahkan masalah Anda: stackoverflow.com/help/someone-answers - person Sobrique; 10.07.2015