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

📄 matrix.java

📁 一个数据挖掘软件ALPHAMINERR的整个过程的JAVA版源代码
💻 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 + -