public static Solution nonsymmEigen(VectorFunction<Double, Double> A, int W, int K, double epsilon) {
final ArnoldiAlgorithm.Solution arnoldi = ArnoldiAlgorithm.solve(A, randomUnitNormVector(W), K);
final HessenbergQR.Solution soln = HessenbergQR.solve(arnoldi.K, arnoldi.h);
final int[] order = order(soln.d);
double[][] U = new double[arnoldi.K][W];
for (int i = 0; i < W; i++) {
for (int j = 0; j < arnoldi.K; j++) {
for (int k = 0; k < arnoldi.K; k++) {
U[j][i] += arnoldi.q[k].doubleValue(i) * soln.V[k][order[j]];
}
}
}
double[] S = new double[arnoldi.K];
for (int i = 0; i < arnoldi.K; i++) {
S[i] = soln.d[order[i]];
}
return new Solution(U, null, soln.d);
}
private static Random random;