public static double[] eigs(EigenDecomposition<DenseMatrix64F> decomp) { double[] togo = new double[decomp.getNumberOfEigenvalues()]; for (int i = 0; i < togo.length; ++i) { togo[i] = decomp.getEigenvalue(i).real; } return togo; }
public static OptimisationReport NiuDunLaFuSunStep( MatrixChains chain, double[] angles, boolean printStep) { // see: http://code.google.com/p/efficient-java-matrix-library/wiki/SolvingLinearSystems int l = angles.length; DenseMatrix64F J = get2d(chain, angles); DenseMatrix64F grad = get1d(chain, angles); DenseMatrix64F propose = vector(l); boolean solved = CommonOps.solve(J, grad, propose); for (int i = 0; i < l; ++i) { if (Double.isNaN(propose.data[i])) { solved = false; } } OptimisationReport togo = new OptimisationReport(); try { if (!solved) { throw new RuntimeException("Failed to solve update equation"); } CommonOps.scale(-1, propose); if (printStep) { EigenDecomposition<DenseMatrix64F> decomp = DecompositionFactory.eigSymm(l, false); boolean posed = decomp.decompose(J); if (!posed) { throw new RuntimeException("Failed to decompose matrix"); } double[] eigs = eigs(decomp); System.out.println("Computed eigenvalues " + printVec(eigs)); togo.eigenvalues = eigs; } tryProposal(chain, propose, grad, angles, printStep, togo); } catch (Exception e) { System.out.println( "Failed to find suitable proposal from Newton step - trying gradient step"); propose.set(grad); CommonOps.scale(-1, propose); tryProposal(chain, propose, grad, angles, printStep, togo); } return togo; }