[system] / trunk / pg / macros / PGmorematrixmacros.pl Repository:
ViewVC logotype

Annotation of /trunk/pg/macros/PGmorematrixmacros.pl

Parent Directory Parent Directory | Revision Log 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