⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.java

📁 wekaUT是 university texas austin 开发的基于weka的半指导学习(semi supervised learning)的分类器
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
      } else {		// Generate Householder vector.	for (int k = 0; k < i; k++) {	  d[k] /= scale;	  h += d[k] * d[k];	}	double f = d[i-1];	double g = Math.sqrt(h);	if (f > 0) {	  g = -g;	}	e[i] = scale * g;	h = h - f * g;	d[i-1] = f - g;	for (int j = 0; j < i; j++) {	  e[j] = 0.0;	}		// Apply similarity transformation to remaining columns.	for (int j = 0; j < i; j++) {	  f = d[j];	  V[j][i] = f;	  g = e[j] + V[j][j] * f;	  for (int k = j+1; k <= i-1; k++) {	    g += V[k][j] * d[k];	    e[k] += V[k][j] * f;	  }	  e[j] = g;	}	f = 0.0;	for (int j = 0; j < i; j++) {	  e[j] /= h;	  f += e[j] * d[j];	}	double hh = f / (h + h);	for (int j = 0; j < i; j++) {	  e[j] -= hh * d[j];	}	for (int j = 0; j < i; j++) {	  f = d[j];	  g = e[j];	  for (int k = j; k <= i-1; k++) {	    V[k][j] -= (f * e[k] + g * d[k]);	  }	  d[j] = V[i-1][j];	  V[i][j] = 0.0;	}      }      d[i] = h;    }    // v = new Matrix(V);    // System.out.println("before accumulate Matrix V \n" + v);    // Accumulate transformations.        for (int i = 0; i < n-1; i++) {      V[n-1][i] = V[i][i];      V[i][i] = 1.0;      double h = d[i+1];      if (h != 0.0) {	for (int k = 0; k <= i; k++) {	  d[k] = V[k][i+1] / h;	}	for (int j = 0; j <= i; j++) {	  double g = 0.0;	  for (int k = 0; k <= i; k++) {	    g += V[k][i+1] * V[k][j];	  }	  for (int k = 0; k <= i; k++) {	    V[k][j] -= g * d[k];	  }	}      }      for (int k = 0; k <= i; k++) {	V[k][i+1] = 0.0;      }            // v = new Matrix(V);      // System.out.println(" accumulate " + i + " Matrix V \n" + v);    }    for (int j = 0; j < n; j++) {      d[j] = V[n-1][j];      V[n-1][j] = 0.0;    }    V[n-1][n-1] = 1.0;    e[0] = 0.0;    // v = new Matrix(V);    // System.out.println(" end accumulate  Matrix V \n" + v);  }     /**   * Symmetric tridiagonal QL algorithm.   *   * This function is adapted from the CERN Jet Java libraries, for it    * the following copyright applies (see also, text on top of file)   * Copyright (C) 1999 CERN - European Organization for Nuclear Research.   *   * @param V tridiagonalized matrix   * @param d   * @param e   * @param n size of matrix   * @Exception if factorization fails   */  private void tql2 (double [][] V, double [] d, double [] e, int n)    throws Exception {        //  This is derived from the Algol procedures tql2, by    //  Bowdler, Martin, Reinsch, and Wilkinson, Handbook for    //  Auto. Comp., Vol.ii-Linear Algebra, and the corresponding    //  Fortran subroutine in EISPACK.        for (int i = 1; i < n; i++) {      e[i-1] = e[i];    }    e[n-1] = 0.0;        double f = 0.0;    double tst1 = 0.0;    double eps = Math.pow(2.0,-52.0);    for (int l = 0; l < n; l++) {            // Find small subdiagonal element            tst1 = Math.max(tst1,Math.abs(d[l]) + Math.abs(e[l]));      int m = l;      while (m < n) {	if (Math.abs(e[m]) <= eps*tst1) {	  break;	}	m++;      }            // If m == l, d[l] is an eigenvalue,      // otherwise, iterate.            if (m > l) {	int iter = 0;	do {	  iter = iter + 1;  // (Could check iteration count here.)	  	  // Compute implicit shift	  	  double g = d[l];	  double p = (d[l+1] - g) / (2.0 * e[l]);	  double r = hypot(p,1.0);	  if (p < 0) {	    r = -r;	  }	  d[l] = e[l] / (p + r);	  d[l+1] = e[l] * (p + r);	  double dl1 = d[l+1];	  double h = g - d[l];	  for (int i = l+2; i < n; i++) {	    d[i] -= h;	  }	  f = f + h;	  	  // Implicit QL transformation.	  	  p = d[m];	  double c = 1.0;	  double c2 = c;	  double c3 = c;	  double el1 = e[l+1];	  double s = 0.0;	  double s2 = 0.0;	  for (int i = m-1; i >= l; i--) {	    c3 = c2;	    c2 = c;	    s2 = s;	    g = c * e[i];	    h = c * p;	    r = Matrix.hypot(p,e[i]);	    e[i+1] = s * r;	    s = e[i] / r;	    c = p / r;	    p = c * d[i] - s * g;	    d[i+1] = h + s * (c * g + s * d[i]);	    	    // Accumulate transformation.	    	    for (int k = 0; k < n; k++) {	      h = V[k][i+1];	      V[k][i+1] = s * V[k][i] + c * h;	      V[k][i] = c * V[k][i] - s * h;	    }	    // Matrix v = new Matrix(V);	    // System.out.println("Matrix V \n" + v);	  }	  p = -s * s2 * c3 * el1 * e[l] / dl1;	  e[l] = s * p;	  d[l] = c * p;	  	  // Check for convergence.	  	} while (Math.abs(e[l]) > eps*tst1);      }      d[l] = d[l] + f;      e[l] = 0.0;    }        // Sort eigenvalues and corresponding vectors.    /*     for (int i = 0; i < n-1; i++) {      int k = i;      double p = d[i];      for (int j = i+1; j < n; j++) {	if (d[j] < p) {	  k = j;	  p = d[j];	}      }      if (k != i) {	d[k] = d[i];	d[i] = p;	for (int j = 0; j < n; j++) {	  p = V[j][i];	  V[j][i] = V[j][k];	  V[j][k] = p;	}      }    }*/      }     /**   * Returns sqrt(a^2 + b^2) without under/overflow.   *      * This function is adapted from the CERN Jet Java libraries, for it    * the following copyright applies (see also, text on top of file)   * Copyright (C) 1999 CERN - European Organization for Nuclear Research.   *   * @param a length of one side of rectangular triangle   * @param b length of other side of rectangular triangle   * @return lenght of third side   */  protected static double hypot(double a, double b) {    double r;    if (Math.abs(a) > Math.abs(b)) {      r = b/a;      r = Math.abs(a)*Math.sqrt(1+r*r);    } else if (b != 0) {      r = a/b;      r = Math.abs(b)*Math.sqrt(1+r*r);    } else {      r = 0.0;    }    return r;  }  /**   * Test eigenvectors and eigenvalues.   * function is used for debugging   *   * @param V matrix with eigenvectors of A   * @param d array with eigenvalues of A   * @exception if new matrix cannot be made   */  public boolean testEigen(Matrix V, double [] d, boolean verbose)    throws Exception {    boolean equal = true;    if (verbose) {      System.out.println("--- test Eigenvectors and Eigenvalues of Matrix A --------");      System.out.println("Matrix A \n" + this);      System.out.println("Matrix V, the columns are the Eigenvectors\n" + V);      System.out.println("the Eigenvalues are");      for (int k = 0; k < d.length; k++) {	System.out.println( Utils.doubleToString(d[k], 2));      }      System.out.println("\n---");    }    double [][] f = new double[V.numRows()][1];    Matrix F = new Matrix(f);    for (int i = 0; i < V.numRows(); i++) {      double [] col =  V.getColumn(i);      double norm = 0.0;      for (int j = 0; j < col.length; j++) {	norm += Math.pow(col[j], 2.0);      }      norm = Math.pow(norm, 0.5);            F.setColumn(0, V.getColumn(i));      if (verbose)	System.out.println("Eigenvektor " + i + " =\n" + F + "\nNorm " + norm);      Matrix R = this.multiply(F);      if (verbose) {	System.out.println("this x Eigenvektor " + i + " =\n");	for (int k = 0; k < V.numRows(); k++) {	  System.out.print(Utils.doubleToString(R.getElement(k, 0), 2) + "  ");	}	System.out.println(" ");	System.out.println(" ");	System.out.println("Eigenvektor "+ i + " x Eigenvalue " +			   Utils.doubleToString(d[i], 2) +" =");      }      for (int k = 0; k < V.numRows() && equal; k++) {	double dd = F.getElement(k, 0) * d[i];	double diff = dd - R.getElement(k, 0);	equal = Math.abs(diff) < Utils.SMALL;	if (Math.abs(diff) > Utils.SMALL)	  System.out.println("OOOOOOps");	if (verbose) {	  System.out.print( Utils.doubleToString(dd, 2) + "  ");	}      }      if (verbose) {	System.out.println(" ");	System.out.println("---");      }    }    return equal;  }    /**   * Main method for testing this class.   */  public static void main(String[] ops) {    double[] first = {2.3, 1.2, 5};    double[] second = {5.2, 1.4, 9};    double[] response = {4, 7, 8};    double[] weights = {1, 2, 3};    try {      // test eigenvaluedecomposition      double [][] m = {{1, 2, 3}, {2, 5, 6},{3, 6, 9}};      Matrix M = new Matrix(m);      int n = M.numRows();      double [][] V = new double[n][n];      double [] d = new double[n];      double [] e = new double[n];      M.eigenvalueDecomposition(V, d);      Matrix v = new Matrix(V);      // M.testEigen(v, d, );      // end of test-eigenvaluedecomposition            Matrix a = new Matrix(2, 3);      Matrix b = new Matrix(3, 2);      System.out.println("Number of columns for a: " + a.numColumns());      System.out.println("Number of rows for a: " + a.numRows());      a.setRow(0, first);      a.setRow(1, second);      b.setColumn(0, first);      b.setColumn(1, second);      System.out.println("a:\n " + a);      System.out.println("b:\n " + b);      System.out.println("a (0, 0): " + a.getElement(0, 0));      System.out.println("a transposed:\n " + a.transpose());      System.out.println("a * b:\n " + a.multiply(b));      Matrix r = new Matrix(3, 1);      r.setColumn(0, response);      System.out.println("r:\n " + r);      System.out.println("Coefficients of regression of b on r: ");      double[] coefficients = b.regression(r, 1.0e-8);      for (int i = 0; i < coefficients.length; i++) {	System.out.print(coefficients[i] + " ");      }      System.out.println();      System.out.println("Weights: ");      for (int i = 0; i < weights.length; i++) {	System.out.print(weights[i] + " ");      }      System.out.println();      System.out.println("Coefficients of weighted regression of b on r: ");      coefficients = b.regression(r, weights, 1.0e-8);      for (int i = 0; i < coefficients.length; i++) {	System.out.print(coefficients[i] + " ");      }      System.out.println();      a.setElement(0, 0, 6);      System.out.println("a with (0, 0) set to 6:\n " + a);      a.write(new java.io.FileWriter("main.matrix"));      System.out.println("wrote matrix to \"main.matrix\"\n" + a);      a = new Matrix(new java.io.FileReader("main.matrix"));      System.out.println("read matrix from \"main.matrix\"\n" + a);    } catch (Exception e) {      e.printStackTrace();    }  }  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -