private static void toR(TridiagonalMatrix tm) { System.out.print("tridiag(c("); for (int i = 0; i < tm.alpha().length; i++) { System.out.print(tm.alpha()[i]); if (i + 1 != tm.alpha().length) { System.out.print(","); } } System.out.print("),c("); for (int i = 0; i < tm.beta().length; i++) { System.out.print(tm.beta()[i]); if (i + 1 != tm.beta().length) { System.out.print(","); } } System.out.println("))"); }
} else if (n == 2) { double lambda1, lambda2; lambda1 = lambda2 = tridiag.alpha()[0] + tridiag.alpha()[1]; double t = Math.sqrt((tridiag.alpha()[0] + tridiag.alpha()[1]) * (tridiag.alpha()[0] + tridiag.alpha()[1]) - 4.0 * (tridiag.alpha()[0] * tridiag.alpha()[1] - tridiag.beta()[0] * tridiag.beta()[0])); lambda1 = (lambda1 + t) / 2.0; lambda2 = (lambda2 - t) / 2.0; double u = (lambda1 + tridiag.alpha()[1]) / tridiag.beta()[0]; double c = Math.sqrt(1.0 / (1.0 + u * u)); double s = c / u; wilkinsonShift(tridiag.alpha(), tridiag.beta(), p, n - p - q, givensSeq); } else { q++; return new Solution(tridiag.alpha(), givensSeq); } else { double[] eigenvalues = new double[n + trivial.eigenvalues.length]; System.arraycopy(tridiag.alpha(), 0, eigenvalues, 0, n); System.arraycopy(trivial.eigenvalues, 0, eigenvalues, n, trivial.eigenvalues.length); return new Solution(eigenvalues, givensSeq);
public static Solution calculateSymmetric(IntIterable corpus, int W, int J, int K, double epsilon) { final LanczosAlgorithm.Solution iLanczos = LanczosAlgorithm.lanczos(new InnerProductMultiplication(corpus, J), randomUnitNormVector(W), K, 1.0); final QRAlgorithm.Solution iQrSolve = QRAlgorithm.qrSolve(epsilon, iLanczos.tridiagonal(), null); final double[][] iEigens = iQrSolve.givensSeq().applyTo(iLanczos.q()); final int[] iOrder = order(iQrSolve.values()); final double[] S = new double[K]; final double[][] V = new double[K][]; for (int i = 0; i < K; i++) { S[i] = Math.sqrt(Math.abs(iLanczos.tridiagonal().alpha()[iOrder[i]])); V[i] = iEigens[iOrder[i]]; } return new Solution(V, null, S); }
public static Solution eigen(VectorFunction<Double, Double> apply, int W, int K, double epsilon) { final LanczosAlgorithm.Solution iLanczos = LanczosAlgorithm.lanczos(apply, randomUnitNormVector(W), K, 1.0); final QRAlgorithm.Solution iQrSolve = QRAlgorithm.qrSolve(epsilon, iLanczos.tridiagonal(), null); final double[][] iEigens = iQrSolve.givensSeq().applyTo(iLanczos.q()); final int[] iOrder = order(iQrSolve.values()); final double[] S = new double[K]; final double[][] V = new double[K][]; for (int i = 0; i < K; i++) { S[i] = Math.sqrt(Math.abs(iLanczos.tridiagonal().alpha()[iOrder[i]])); V[i] = iEigens[iOrder[i]]; } return new Solution(V, null, S); }
public static Solution calculate(IntIterable corpus, int W, int J, int K, double epsilon) { final LanczosAlgorithm.Solution oLanczos = LanczosAlgorithm.lanczos(new OuterProductMultiplication(corpus, W), randomUnitNormVector(J), K, 1.0); final QRAlgorithm.Solution oQrSolve = QRAlgorithm.qrSolve(epsilon, oLanczos.tridiagonal(), null); final double[][] oEigens = oQrSolve.givensSeq().applyTo(oLanczos.q()); final int[] oOrder = order(oQrSolve.values()); final LanczosAlgorithm.Solution iLanczos = LanczosAlgorithm.lanczos(new InnerProductMultiplication(corpus, J), randomUnitNormVector(W), K, 1.0); final QRAlgorithm.Solution iQrSolve = QRAlgorithm.qrSolve(epsilon, iLanczos.tridiagonal(), null); final double[][] iEigens = iQrSolve.givensSeq().applyTo(iLanczos.q()); final int[] iOrder = order(iQrSolve.values()); final double[][] V = new double[K][]; final double[][] U = new double[K][]; final double[] S = new double[K]; for (int i = 0; i < K; i++) { S[i] = Math.sqrt(Math.abs((oLanczos.tridiagonal().alpha()[oOrder[i]] + iLanczos.tridiagonal().alpha()[iOrder[i]]) / 2.0)); U[i] = oEigens[oOrder[i]]; V[i] = iEigens[iOrder[i]]; } return new Solution(U, V, S); }