📄 testmatrix.java
字号:
try { DecimalFormat fmt = new DecimalFormat("0.0000E00"); fmt.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US)); PrintWriter FILE = new PrintWriter(new FileOutputStream("JamaTestMatrix.out")); A.print(FILE,fmt,10); FILE.close(); R = Matrix.read(new BufferedReader(new FileReader("JamaTestMatrix.out"))); if (A.minus(R).norm1() < .001 ) { try_success("print()/read()...",""); } else { errorCount = try_failure(errorCount,"print()/read()...","Matrix read from file does not match Matrix printed to file"); } } catch ( java.io.IOException ioe ) { warningCount = try_warning(warningCount,"print()/read()...","unexpected I/O error, unable to run print/read test; check write permission in current directory and retry"); } catch(Exception e) { try { e.printStackTrace(System.out); warningCount = try_warning(warningCount,"print()/read()...","Formatting error... will try JDK1.1 reformulation..."); DecimalFormat fmt = new DecimalFormat("0.0000"); PrintWriter FILE = new PrintWriter(new FileOutputStream("JamaTestMatrix.out")); A.print(FILE,fmt,10); FILE.close(); R = Matrix.read(new BufferedReader(new FileReader("JamaTestMatrix.out"))); if (A.minus(R).norm1() < .001 ) { try_success("print()/read()...",""); } else { errorCount = try_failure(errorCount,"print()/read() (2nd attempt) ...","Matrix read from file does not match Matrix printed to file"); } } catch ( java.io.IOException ioe ) { warningCount = try_warning(warningCount,"print()/read()...","unexpected I/O error, unable to run print/read test; check write permission in current directory and retry"); } } R = Matrix.random(A.getRowDimension(),A.getColumnDimension()); String tmpname = "TMPMATRIX.serial"; try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(tmpname)); out.writeObject(R); ObjectInputStream sin = new ObjectInputStream(new FileInputStream(tmpname)); A = (Matrix) sin.readObject(); try { check(A,R); try_success("writeObject(Matrix)/readObject(Matrix)...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"writeObject(Matrix)/readObject(Matrix)...","Matrix not serialized correctly"); } } catch ( java.io.IOException ioe ) { warningCount = try_warning(warningCount,"writeObject()/readObject()...","unexpected I/O error, unable to run serialization test; check write permission in current directory and retry"); } catch(Exception e) { errorCount = try_failure(errorCount,"writeObject(Matrix)/readObject(Matrix)...","unexpected error in serialization test"); }/** LA methods: transpose times cond rank det trace norm1 norm2 normF normInf solve solveTranspose inverse chol eig lu qr svd **/ print("\nTesting linear algebra methods...\n"); A = new Matrix(columnwise,3); T = new Matrix(tvals); T = A.transpose(); try { check(A.transpose(),T); try_success("transpose...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"transpose()...","transpose unsuccessful"); } A.transpose(); try { check(A.norm1(),columnsummax); try_success("norm1...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"norm1()...","incorrect norm calculation"); } try { check(A.normInf(),rowsummax); try_success("normInf()...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"normInf()...","incorrect norm calculation"); } try { check(A.normF(),Math.sqrt(sumofsquares)); try_success("normF...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"normF()...","incorrect norm calculation"); } try { check(A.trace(),sumofdiagonals); try_success("trace()...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"trace()...","incorrect trace calculation"); } try { check(A.getMatrix(0,A.getRowDimension()-1,0,A.getRowDimension()-1).det(),0.); try_success("det()...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"det()...","incorrect determinant calculation"); } SQ = new Matrix(square); try { check(A.times(A.transpose()),SQ); try_success("times(Matrix)...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"times(Matrix)...","incorrect Matrix-Matrix product calculation"); } try { check(A.times(0.),Z); try_success("times(double)...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"times(double)...","incorrect Matrix-scalar product calculation"); } A = new Matrix(columnwise,4); QRDecomposition QR = A.qr(); R = QR.getR(); try { check(A,QR.getQ().times(R)); try_success("QRDecomposition...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"QRDecomposition...","incorrect QR decomposition calculation"); } SingularValueDecomposition SVD = A.svd(); try { check(A,SVD.getU().times(SVD.getS().times(SVD.getV().transpose()))); try_success("SingularValueDecomposition...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"SingularValueDecomposition...","incorrect singular value decomposition calculation"); } DEF = new Matrix(rankdef); try { check(DEF.rank(),Math.min(DEF.getRowDimension(),DEF.getColumnDimension())-1); try_success("rank()...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"rank()...","incorrect rank calculation"); } B = new Matrix(condmat); SVD = B.svd(); double [] singularvalues = SVD.getSingularValues(); try { check(B.cond(),singularvalues[0]/singularvalues[Math.min(B.getRowDimension(),B.getColumnDimension())-1]); try_success("cond()...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"cond()...","incorrect condition number calculation"); } int n = A.getColumnDimension(); A = A.getMatrix(0,n-1,0,n-1); A.set(0,0,0.); LUDecomposition LU = A.lu(); try { check(A.getMatrix(LU.getPivot(),0,n-1),LU.getL().times(LU.getU())); try_success("LUDecomposition...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"LUDecomposition...","incorrect LU decomposition calculation"); } X = A.inverse(); try { check(A.times(X),Matrix.identity(3,3)); try_success("inverse()...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"inverse()...","incorrect inverse calculation"); } O = new Matrix(SUB.getRowDimension(),1,1.0); SOL = new Matrix(sqSolution); SQ = SUB.getMatrix(0,SUB.getRowDimension()-1,0,SUB.getRowDimension()-1); try { check(SQ.solve(SOL),O); try_success("solve()...",""); } catch ( java.lang.IllegalArgumentException e1 ) { errorCount = try_failure(errorCount,"solve()...",e1.getMessage()); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"solve()...",e.getMessage()); } A = new Matrix(pvals); CholeskyDecomposition Chol = A.chol(); Matrix L = Chol.getL(); try { check(A,L.times(L.transpose())); try_success("CholeskyDecomposition...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"CholeskyDecomposition...","incorrect Cholesky decomposition calculation"); } X = Chol.solve(Matrix.identity(3,3)); try { check(A.times(X),Matrix.identity(3,3)); try_success("CholeskyDecomposition solve()...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"CholeskyDecomposition solve()...","incorrect Choleskydecomposition solve calculation"); } EigenvalueDecomposition Eig = A.eig(); Matrix D = Eig.getD(); Matrix V = Eig.getV(); try { check(A.times(V),V.times(D)); try_success("EigenvalueDecomposition (symmetric)...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"EigenvalueDecomposition (symmetric)...","incorrect symmetric Eigenvalue decomposition calculation"); } A = new Matrix(evals); Eig = A.eig(); D = Eig.getD(); V = Eig.getV(); try { check(A.times(V),V.times(D)); try_success("EigenvalueDecomposition (nonsymmetric)...",""); } catch ( java.lang.RuntimeException e ) { errorCount = try_failure(errorCount,"EigenvalueDecomposition (nonsymmetric)...","incorrect nonsymmetric Eigenvalue decomposition calculation"); } print("\nTestMatrix completed.\n"); print("Total errors reported: " + Integer.toString(errorCount) + "\n"); print("Total warnings reported: " + Integer.toString(warningCount) + "\n"); } /** private utility routines **/ /** Check magnitude of difference of scalars. **/ private static void check(double x, double y) { double eps = Math.pow(2.0,-52.0); if (x == 0 & Math.abs(y) < 10*eps) return; if (y == 0 & Math.abs(x) < 10*eps) return; if (Math.abs(x-y) > 10*eps*Math.max(Math.abs(x),Math.abs(y))) { throw new RuntimeException("The difference x-y is too large: x = " + Double.toString(x) + " y = " + Double.toString(y)); } } /** Check norm of difference of "vectors". **/ private static void check(double[] x, double[] y) { if (x.length == y.length ) { for (int i=0;i<x.length;i++) { check(x[i],y[i]); } } else { throw new RuntimeException("Attempt to compare vectors of different lengths"); } } /** Check norm of difference of arrays. **/ private static void check(double[][] x, double[][] y) { Matrix A = new Matrix(x); Matrix B = new Matrix(y); check(A,B); } /** Check norm of difference of Matrices. **/ private static void check(Matrix X, Matrix Y) { double eps = Math.pow(2.0,-52.0); if (X.norm1() == 0. & Y.norm1() < 10*eps) return; if (Y.norm1() == 0. & X.norm1() < 10*eps) return; if (X.minus(Y).norm1() > 1000*eps*Math.max(X.norm1(),Y.norm1())) { throw new RuntimeException("The norm of (X-Y) is too large: " + Double.toString(X.minus(Y).norm1())); } } /** Shorten spelling of print. **/ private static void print (String s) { System.out.print(s); } /** Print appropriate messages for successful outcome try **/ private static void try_success (String s,String e) { print("> " + s + "success\n"); if ( e != "" ) { print("> Message: " + e + "\n"); } } /** Print appropriate messages for unsuccessful outcome try **/ private static int try_failure (int count, String s,String e) { print("> " + s + "*** failure ***\n> Message: " + e + "\n"); return ++count; } /** Print appropriate messages for unsuccessful outcome try **/ private static int try_warning (int count, String s,String e) { print("> " + s + "*** warning ***\n> Message: " + e + "\n"); return ++count; } /** Print a row vector. **/ private static void print(double[] x, int w, int d) { // Use format Fw.d for all elements. System.out.print("\n"); new Matrix(x,1).print(w,d); print("\n"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -