Perl科学计算(1.2)
Perl科学计算(1.2)
1 #分布函数 2 my @ex8=(1,9,4,9,10,12,13,15,12,13); 3 my %hash=&frequency(\@ex8); 4 print join(",",values %hash); 5 print join(",",keys %hash); 6 7 sub frequency{ 8 my($vec)=@_; 9 my %hash; 10 foreach(@$vec){ 11 ++$hash{$_}; 12 } 13 return %hash; 14 } 15 16 #排序函数 17 my @ex9=(1,9,4,9,10,12,13,15,12,13); 18 print join(',',&sortf("numeric","asc",\@ex9)); 19 20 sub sortf{ 21 my($type,$direction,$vec)=@_; 22 my @vec_sort; 23 if(($type eq "numeric") & ($direction eq "asc")){ 24 @vec_sort=sort{$a<=>$b}@$vec; 25 } 26 if(($type eq "numeric") & ($direction eq "desc")){ 27 @vec_sort=sort{$b<=>$a}@$vec; 28 } 29 if(($type eq "string") & ($direction eq "asc")){ 30 @vec_sort=sort{$a cmp $b}@$vec; 31 } 32 if(($type eq "string") & ($direction eq "desc")){ 33 @vec_sort=sort{$b cmp $a}@$vec; 34 } 35 return @vec_sort; 36 } 37 38 #众数 39 my @ex10=(1,9,4,9,10,12,13,15,12,13); 40 print join(',',&mode(\@ex10)); 41 42 sub mode{ 43 my($vec)=@_; 44 my %hash=&frequency($vec); 45 my @result; 46 foreach(sort{ $hash{$b}<=>$hash{$a} } keys %hash){ 47 last if @result && $hash{$_} != $hash{$result[0]}; 48 push(@result,$_); 49 } 50 return @result; 51 } 52 53 #中位数 54 my @ex111=(1,9,4,5); 55 print &median(\@ex11); 56 my @ex112=(1,9,4,5,5); 57 58 sub median{ 59 my($vec)=@_; 60 my @vec1=&sortf('numeric','asc',$vec); 61 my $length=scalar @$vec; 62 my $result; 63 if($length % 2){ 64 $result=$vec1[($length-1)/2]; 65 }else{ 66 $result=($vec1[$length/2]+$vec1[$length/2-1])/2; 67 } 68 return $result; 69 } 70 71 #四分之一分位数 72 73 my @ex12=( 7, 15, 36, 39, 40, 41); 74 print join(',',&quantile(\@ex12)); 75 76 sub quantile{ 77 my($vec)=@_; 78 my @vec1=&sortf('numeric','asc',$vec); 79 my $length=scalar @$vec+1; 80 my($upper,$lower); 81 if($length %4 ){ 82 my $temp1=int($length/4); 83 my $temp2=int(3*$length/4); 84 $upper=$vec1[$temp1-1]+($vec1[$temp1]-$vec1[$temp1-1])*($length/4-$temp1); 85 $lower=$vec1[$temp2-1]+($vec1[$temp2]-$vec1[$temp2-1])*(3*$length/4-$temp2); 86 }else{ 87 $upper=$vec1[$length/4-1]; 88 $lower=$vec1[3*$length/4-1]; 89 } 90 my @result=($upper,$lower); 91 return @result; 92 } 93 94 #最大值 95 my @ex13=( 7, 15, 36, 39, 40, 41); 96 print &max(\@ex13); 97 98 sub max{ 99 my($vec)=@_; 100 my @result=&sortf('numeric','desc',$vec); 101 return $result[0]; 102 } 103 104 #最小值 105 my @ex14=( 7, 15, 36, 39, 40, 41); 106 print &min(\@ex14); 107 108 sub min{ 109 my($vec)=@_; 110 my @result=&sortf('numeric','asc',$vec); 111 return $result[0]; 112 }; 113 #标准化,共2种方法 114 my @ex15=( 7, 15, 36, 39, 40, 41); 115 print join(',',&scale(\@ex15,2)); 116 117 sub scale{ 118 my($vec,$m)=@_; 119 my @result; 120 if($m eq 1){ 121 if(&max($vec) eq &min($vec)){ 122 die "could not scale as range method!"; 123 }else{ 124 @result=map(($_-&min($vec))/(&max($vec)-&min($vec)),@$vec); 125 } 126 return @result; 127 } 128 if($m eq 2){ 129 if(&var($vec) eq 0){ 130 die "could not scale as centered method!"; 131 }else{ 132 @result=map(($_-&mean($vec))/&sd($vec),@$vec); 133 } 134 return @result; 135 } 136 } 137