Parent Directory
|
Revision Log
Revision 1064 - (view) (download) (as text)
| 1 : | gage | 1064 | #!/usr/local/bin/webwork-perl |
| 2 : | |||
| 3 : | BEGIN{ | ||
| 4 : | be_strict(); | ||
| 5 : | } | ||
| 6 : | |||
| 7 : | sub _PGmorematrixmacros_init{} | ||
| 8 : | |||
| 9 : | sub random_inv_matrix { ## Builds and returns a random invertible \$row by \$col matrix. | ||
| 10 : | |||
| 11 : | warn "Usage: \$new_matrix = random_inv_matrix(\$rows,\$cols)" | ||
| 12 : | if (@_ != 2); | ||
| 13 : | my $A = new Matrix($_[0],$_[1]); | ||
| 14 : | my $A_lr = new Matrix($_[0],$_[1]); | ||
| 15 : | my $det = 0; | ||
| 16 : | my $safety=0; | ||
| 17 : | while ($det == 0 and $safety < 6) { | ||
| 18 : | foreach my $i (1..$_[0]) { | ||
| 19 : | foreach my $j (1..$_[1]) { | ||
| 20 : | $A->assign($i,$j,random(-9,9,1) ); | ||
| 21 : | } | ||
| 22 : | } | ||
| 23 : | $A_lr = $A->decompose_LR(); | ||
| 24 : | $det = $A_lr->det_LR(); | ||
| 25 : | } | ||
| 26 : | return $A; | ||
| 27 : | } | ||
| 28 : | |||
| 29 : | sub swap_rows{ | ||
| 30 : | |||
| 31 : | warn "Usage: \$new_matrix = swap_rows(\$matrix,\$row1,\$row2);" | ||
| 32 : | if (@_ != 3); | ||
| 33 : | my $matrix = $_[0]; | ||
| 34 : | my ($i,$j) = ($_[1],$_[2]); | ||
| 35 : | warn "Error: Rows to be swapped must exist!" | ||
| 36 : | if ($i>@$matrix or $j >@$matrix); | ||
| 37 : | warn "Warning: Swapping the same row is pointless" | ||
| 38 : | if ($i==$j); | ||
| 39 : | my $cols = @{$matrix->[0]}; | ||
| 40 : | my $B = new Matrix(@$matrix,$cols); | ||
| 41 : | foreach my $k (1..$cols){ | ||
| 42 : | $B->assign($i,$k,element $matrix($j,$k)); | ||
| 43 : | $B->assign($j,$k,element $matrix($i,$k)); | ||
| 44 : | } | ||
| 45 : | return $B; | ||
| 46 : | } | ||
| 47 : | |||
| 48 : | sub row_mult{ | ||
| 49 : | |||
| 50 : | warn "Usage: \$new_matrix = row_mult(\$matrix,\$scalar,\$row);" | ||
| 51 : | if (@_ != 3); | ||
| 52 : | my $matrix = $_[0]; | ||
| 53 : | my ($scalar,$row) = ($_[1],$_[2]); | ||
| 54 : | warn "Undefined row multiplication" | ||
| 55 : | if ($row > @$matrix); | ||
| 56 : | my $B = new Matrix(@$matrix,@{$matrix->[0]}); | ||
| 57 : | foreach my $j (1..@{$matrix->[0]}) { | ||
| 58 : | $B->assign($row,$j,$scalar*element $matrix($row,$j)); | ||
| 59 : | } | ||
| 60 : | return $B; | ||
| 61 : | } | ||
| 62 : | |||
| 63 : | sub linear_combo{ | ||
| 64 : | |||
| 65 : | warn "Usage: \$new_matrix = linear_combo(\$matrix,\$scalar,\$row1,\$row2);" | ||
| 66 : | if (@_ != 4); | ||
| 67 : | my $matrix = $_[0]; | ||
| 68 : | my ($scalar,$row1,$row2) = ($_[1],$_[2],$_[3]); | ||
| 69 : | warn "Undefined row in multiplication" | ||
| 70 : | if ($row1>@$matrix or $row2>@$matrix); | ||
| 71 : | warn "Warning: Using the same row" | ||
| 72 : | if ($row1==$row2); | ||
| 73 : | my $B = new Matrix(@$matrix,@{$matrix->[0]}); | ||
| 74 : | foreach my $j (1..@$matrix) { | ||
| 75 : | my ($t1,$t2) = (element $matrix($row1,$j),element $matrix($row2,$j)); | ||
| 76 : | $B->assign($row2,$j,$scalar*$t1+$t2); | ||
| 77 : | } | ||
| 78 : | return $B; | ||
| 79 : | } | ||
| 80 : | |||
| 81 : | |||
| 82 : | 1; |
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |