protected double multiply(double[][] mat,double[] in,double[] out){
  double l=0.;
  for (int d1=0; d1 < in.length; d1++) {
    final double[] row=mat[d1];
    double t=0.;
    for (int d2=0; d2 < in.length; d2++) {
      t+=row[d2] * in[d2];
    }
    out[d1]=t;
    l+=t * t;
  }
  return l > 0 ? Math.sqrt(l) : 0.;
}

protected double multiply ( double [ ] [ ] mat , double [ ] in , double [ ] out ) { double l = 0. ; for ( int d1 = 0 ; d1 < in . length ; d1 ++ ) { final double [ ] row = mat [ d1 ] ; double t = 0. ; for ( int d2 = 0 ; d2 < in . length ; d2 ++ ) { t += row [ d2 ] * in [ d2 ] ; } out [ d1 ] = t ; l += t * t ; } return l > 0 ? Math . sqrt ( l ) : 0. ; }
compute out = a * in , and return the ( signed ! ) length of the output vector .
