| 89 | } |
| 90 | |
| 91 | public static void expScale(final double[] r) { |
| 92 | final int n = r.length; |
| 93 | if(n>0) { |
| 94 | double max = r[0]; |
| 95 | for(int i=1;i<n;++i) { |
| 96 | max = Math.max(max,r[i]); |
| 97 | } |
| 98 | double total = 0.0; |
| 99 | for(int i=0;i<n;++i) { |
| 100 | final double diff = r[i] - max; |
| 101 | final double vi; |
| 102 | if(diff<0.0) { |
| 103 | vi = Math.exp(diff); |
| 104 | } else { |
| 105 | vi = 1.0; |
| 106 | } |
| 107 | r[i] = vi; |
| 108 | total += vi; |
| 109 | } |
| 110 | final double scale = 1.0/total; |
| 111 | for(int i=0;i<n;++i) { |
| 112 | r[i] *= scale; |
| 113 | } |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | /** |
| 118 | * from: http://martin.ankerl.com/2007/02/11/optimized-exponential-functions-for-java/ |