Reduced row echelon form: Difference between revisions

m
→‎{{header|Perl 6}}: Updated to work with latest Rakudo, minor updates
m (changed test orders)
m (→‎{{header|Perl 6}}: Updated to work with latest Rakudo, minor updates)
Line 2,381:
=={{header|Perl 6}}==
{{trans|Perl}}
{{works with|Rakudo|20102015.12}}
<lang perl6>sub rref (@m is rw) {
@m or return;
my ($lead, $rows, $cols) = 0, +@m, +@m[0];
 
for ^$rows -> $r {
return @m if $lead <>= $cols or return @m;
my $i = $r;
 
until @m[$i][$lead] {
++$i == $rows or next;
Line 2,407:
++$lead;
}
@m;
}
 
sub rat_or_intrat-or-int ($num is rw) {
return $num unless $num ~~ Rat;
return $num.Intnarrow if $num.denominatornarrow.WHAT ==~~ 1Int;
return $num.perlnude.join: '/';
}
 
sub say_it ($message, @array) {
say "\n$message";
$_».&rat_or_intrat-or-int.fmt(" %5s").say for @array;
}
 
Line 2,559:
First, a procedural version:
<lang perl6>sub swap_rows ( @M, $r1, $r2 ) { @M[ $r1, $r2 ] = @M[ $r2, $r1 ] };
sub scale_row ( @M, $scale, $r ) { @M[$r] = @M[$r] X»*» $scale };
sub shear_row ( @M, $scale, $r1, $r2 ) { @M[$r1] = @M[$r1].list Z»+» ( @M[$r2] X»*» $scale ) };
sub reduce_row ( @M, $r, $c ) { scale_row( @M, 1/@M[$r][$c], $r ) };
sub clear_column ( @M, $r, $c ) {
Line 2,594:
<lang perl6>class Matrix is Array {
method unscale_row ( @M: $scale, $row ) {
@M[$row] = @M[$row] X»/» $scale;
}
method unshear_row ( @M: $scale, $r1, $r2 ) {
@M[$r1] = @M[$r1] Z»-» ( @M[$r2] X»*» $scale );
}
method reduce_row ( @M: $row, $col ) {
Line 2,626:
}
 
my $M = Matrix.new.push(
[< 1 2 -1 -4 >],
[< 2 3 -1 -11 >],
10,333

edits