Advertisement
Guest User

Untitled

a guest
Apr 13th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 2.49 KB | None | 0 0
  1. import 'dart:io';
  2. import 'dart:math';
  3.  
  4.  
  5. /**
  6.  * See LinearRegression2() for better singular matrix handler
  7.  *
  8.  */
  9.  
  10. List list(int len, [func]){
  11.   if( func == null ) return new List(len);
  12.   if( func is Function ) return new List.generate(len, func);
  13.   return new List.filled(len, func);
  14. }
  15. List<List> matrix(int height, int width, [func]){
  16.   if( func is Function ) return new List.generate( height, (i){
  17.     return new List.generate(width, (j) => func(i,j));
  18.   }, growable: false );
  19.   return new List.generate( height, (_) => list(width, func), growable: false );
  20. }
  21.  
  22.  
  23. // O( 4/3 * N^3 )
  24. // mat is manipulated in-place, clone if it is not desired.
  25. QRDecomposition(List<List<double> > mat){
  26.   var h = mat.length;
  27.   var w = mat[0].length;
  28.   var mi = min(h,w);
  29.  
  30.   for(var i=0; i<mi; i++){
  31.     var p = mat[i][i];
  32.  
  33.     // norm of column-i
  34.     var s = 0.0;
  35.     for(var j=i; j<h; j++){
  36.       var x = mat[j][i];
  37.       s += x*x;
  38.     }
  39.  
  40.     // theta
  41.     var t = sqrt(s);
  42.     if( p.sign == 1 ) t = -t;
  43.  
  44.     // update columns i+1 to end
  45.     var b0 = (s - p*t);
  46.     for(var j=i+1; j<w; j++){
  47.  
  48.       var b1 = -t * mat[i][j];
  49.       for(var k=i; k<h; k++) b1 += mat[k][i] * mat[k][j];
  50.  
  51.       var b = b1/b0;
  52.       mat[i][j] += b * t;
  53.       for(var k=i; k<h; k++) mat[k][j] -= b * mat[k][i];
  54.     }
  55.  
  56.     // override columns-i
  57.     mat[i][i] = t;
  58.     for(var j=i+1; j<h; j++) mat[j][i] = 0.0;
  59.   }
  60. }
  61.  
  62. // QRDecomposition2(mat) = QRDecomposition( transpose(mat) )
  63. QRDecomposition2(List<List<double> > mat){
  64.   var h = mat.length;
  65.   var w = mat[0].length;
  66.  
  67.   assert( w > h );
  68.  
  69.   dotFrom(i,a,b){
  70.     var s = 0.0;
  71.     for(var j=i; j<w; j++) s += a[j] * b[j];
  72.     return s;
  73.   }
  74.  
  75.   // a[i..w] += c * b[i..w]
  76.   rowAddFrom(i, a, c, b){
  77.     for(var j=i; j<w; j++){
  78.       a[j] += c * b[j];
  79.     }
  80.   }
  81.  
  82.   // Householder transform
  83.   hhTransform(i, b0, x, y){
  84.     var b1 = dotFrom(i,x,y);
  85.     rowAddFrom(i, y, -b1*b0, x);
  86.   }
  87.  
  88.   for(var i=0; i<h; i++){
  89.     // diagonal element (pivot)
  90.     var p = mat[i][i];
  91.  
  92.     // norm of row-i s >= 0
  93.     var s = dotFrom(i+1, mat[i], mat[i]);
  94.  
  95.     // theta
  96.     var t = sqrt(p*p+s);
  97.     // increase p - t
  98.  
  99.     // avoid subtraction near equal number,
  100.     if( p.sign == 1 ) t = -t;
  101.     p = mat[i][i] -= t;
  102.  
  103.  
  104.     var b0 = 2/(p*p+s);
  105.     for(var j=i+1; j<h; j++){
  106.       hhTransform(i, b0, mat[i], mat[j]);
  107.     }
  108.  
  109.     // override columns-i
  110.     mat[i][i] = t;
  111.     // this is not necessary for least square problem
  112.     mat[i].fillRange(i+1, w, 0.0);
  113.   }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement