日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java 矩阵计算 加减乘除 反转 分解

發布時間:2025/6/15 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 矩阵计算 加减乘除 反转 分解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

矩陣計算

package Jama;import java.text.NumberFormat; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; import java.text.FieldPosition; import java.io.PrintWriter; import java.io.BufferedReader; import java.io.StreamTokenizer; import Jama.util.*;/**Jama = Java Matrix class. <P>The Java Matrix Class provides the fundamental operations of numericallinear algebra. Various constructors create Matrices from two dimensionalarrays of double precision floating point numbers. Various "gets" and"sets" provide access to submatrices and matrix elements. Several methods implement basic matrix arithmetic, including matrix addition andmultiplication, matrix norms, and element-by-element array operations.Methods for reading and printing matrices are also included. All theoperations in this version of the Matrix Class involve real matrices.Complex matrices may be handled in a future version. <P>Five fundamental matrix decompositions, which consist of pairs or triplesof matrices, permutation vectors, and the like, produce results in fivedecomposition classes. These decompositions are accessed by the Matrixclass to compute solutions of simultaneous linear equations, determinants,inverses and other matrix functions. The five decompositions are: <P><UL><LI>Cholesky Decomposition of symmetric, positive definite matrices.<LI>LU Decomposition of rectangular matrices.<LI>QR Decomposition of rectangular matrices.<LI>Singular Value Decomposition of rectangular matrices.<LI>Eigenvalue Decomposition of both symmetric and nonsymmetric square matrices. </UL> <DL> <DT><B>Example of use:</B></DT> <P> <DD>Solve a linear system A x = b and compute the residual norm, ||b - A x||. <P><PRE>double[][] vals = {{1.,2.,3},{4.,5.,6.},{7.,8.,10.}};Matrix A = new Matrix(vals);Matrix b = Matrix.random(3,1);Matrix x = A.solve(b);Matrix r = A.times(x).minus(b);double rnorm = r.normInf(); </PRE></DD> </DL>@author The MathWorks, Inc. and the National Institute of Standards and Technology. @version 5 August 1998 */public class Matrix implements Cloneable, java.io.Serializable {/* ------------------------Class variables* ------------------------ *//** Array for internal storage of elements.@serial internal array storage.*/private double[][] A;/** Row and column dimensions.@serial row dimension.@serial column dimension.*/private int m, n;/* ------------------------Constructors* ------------------------ *//** Construct an m-by-n matrix of zeros. @param m Number of rows.@param n Number of colums.*/public Matrix (int m, int n) {this.m = m;this.n = n;A = new double[m][n];}/** Construct an m-by-n constant matrix.@param m Number of rows.@param n Number of colums.@param s Fill the matrix with this scalar value.*/public Matrix (int m, int n, double s) {this.m = m;this.n = n;A = new double[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = s;}}}/** Construct a matrix from a 2-D array.@param A Two-dimensional array of doubles.@exception IllegalArgumentException All rows must have the same length@see #constructWithCopy*/public Matrix (double[][] A) {m = A.length;n = A[0].length;for (int i = 0; i < m; i++) {if (A[i].length != n) {throw new IllegalArgumentException("All rows must have the same length.");}}this.A = A;}/** Construct a matrix quickly without checking arguments.@param A Two-dimensional array of doubles.@param m Number of rows.@param n Number of colums.*/public Matrix (double[][] A, int m, int n) {this.A = A;this.m = m;this.n = n;}/** Construct a matrix from a one-dimensional packed array@param vals One-dimensional array of doubles, packed by columns (ala Fortran).@param m Number of rows.@exception IllegalArgumentException Array length must be a multiple of m.*/public Matrix (double vals[], int m) {this.m = m;n = (m != 0 ? vals.length/m : 0);if (m*n != vals.length) {throw new IllegalArgumentException("Array length must be a multiple of m.");}A = new double[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = vals[i+j*m];}}}/* ------------------------Public Methods* ------------------------ *//** Construct a matrix from a copy of a 2-D array.@param A Two-dimensional array of doubles.@exception IllegalArgumentException All rows must have the same length*/public static Matrix constructWithCopy(double[][] A) {int m = A.length;int n = A[0].length;Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {if (A[i].length != n) {throw new IllegalArgumentException("All rows must have the same length.");}for (int j = 0; j < n; j++) {C[i][j] = A[i][j];}}return X;}/** Make a deep copy of a matrix*/public Matrix copy () {Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j];}}return X;}/** Clone the Matrix object.*/public Object clone () {return this.copy();}/** Access the internal two-dimensional array.@return Pointer to the two-dimensional array of matrix elements.*/public double[][] getArray () {return A;}/** Copy the internal two-dimensional array.@return Two-dimensional array copy of matrix elements.*/public double[][] getArrayCopy () {double[][] C = new double[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j];}}return C;}/** Make a one-dimensional column packed copy of the internal array.@return Matrix elements packed in a one-dimensional array by columns.*/public double[] getColumnPackedCopy () {double[] vals = new double[m*n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {vals[i+j*m] = A[i][j];}}return vals;}/** Make a one-dimensional row packed copy of the internal array.@return Matrix elements packed in a one-dimensional array by rows.*/public double[] getRowPackedCopy () {double[] vals = new double[m*n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {vals[i*n+j] = A[i][j];}}return vals;}/** Get row dimension.@return m, the number of rows.*/public int getRowDimension () {return m;}/** Get column dimension.@return n, the number of columns.*/public int getColumnDimension () {return n;}/** Get a single element.@param i Row index.@param j Column index.@return A(i,j)@exception ArrayIndexOutOfBoundsException*/public double get (int i, int j) {return A[i][j];}/** Get a submatrix.@param i0 Initial row index@param i1 Final row index@param j0 Initial column index@param j1 Final column index@return A(i0:i1,j0:j1)@exception ArrayIndexOutOfBoundsException Submatrix indices*/public Matrix getMatrix (int i0, int i1, int j0, int j1) {Matrix X = new Matrix(i1-i0+1,j1-j0+1);double[][] B = X.getArray();try {for (int i = i0; i <= i1; i++) {for (int j = j0; j <= j1; j++) {B[i-i0][j-j0] = A[i][j];}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}return X;}/** Get a submatrix.@param r Array of row indices.@param c Array of column indices.@return A(r(:),c(:))@exception ArrayIndexOutOfBoundsException Submatrix indices*/public Matrix getMatrix (int[] r, int[] c) {Matrix X = new Matrix(r.length,c.length);double[][] B = X.getArray();try {for (int i = 0; i < r.length; i++) {for (int j = 0; j < c.length; j++) {B[i][j] = A[r[i]][c[j]];}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}return X;}/** Get a submatrix.@param i0 Initial row index@param i1 Final row index@param c Array of column indices.@return A(i0:i1,c(:))@exception ArrayIndexOutOfBoundsException Submatrix indices*/public Matrix getMatrix (int i0, int i1, int[] c) {Matrix X = new Matrix(i1-i0+1,c.length);double[][] B = X.getArray();try {for (int i = i0; i <= i1; i++) {for (int j = 0; j < c.length; j++) {B[i-i0][j] = A[i][c[j]];}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}return X;}/** Get a submatrix.@param r Array of row indices.@param j0 Initial column index@param j1 Final column index@return A(r(:),j0:j1)@exception ArrayIndexOutOfBoundsException Submatrix indices*/public Matrix getMatrix (int[] r, int j0, int j1) {Matrix X = new Matrix(r.length,j1-j0+1);double[][] B = X.getArray();try {for (int i = 0; i < r.length; i++) {for (int j = j0; j <= j1; j++) {B[i][j-j0] = A[r[i]][j];}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}return X;}/** Set a single element.@param i Row index.@param j Column index.@param s A(i,j).@exception ArrayIndexOutOfBoundsException*/public void set (int i, int j, double s) {A[i][j] = s;}/** Set a submatrix.@param i0 Initial row index@param i1 Final row index@param j0 Initial column index@param j1 Final column index@param X A(i0:i1,j0:j1)@exception ArrayIndexOutOfBoundsException Submatrix indices*/public void setMatrix (int i0, int i1, int j0, int j1, Matrix X) {try {for (int i = i0; i <= i1; i++) {for (int j = j0; j <= j1; j++) {A[i][j] = X.get(i-i0,j-j0);}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}}/** Set a submatrix.@param r Array of row indices.@param c Array of column indices.@param X A(r(:),c(:))@exception ArrayIndexOutOfBoundsException Submatrix indices*/public void setMatrix (int[] r, int[] c, Matrix X) {try {for (int i = 0; i < r.length; i++) {for (int j = 0; j < c.length; j++) {A[r[i]][c[j]] = X.get(i,j);}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}}/** Set a submatrix.@param r Array of row indices.@param j0 Initial column index@param j1 Final column index@param X A(r(:),j0:j1)@exception ArrayIndexOutOfBoundsException Submatrix indices*/public void setMatrix (int[] r, int j0, int j1, Matrix X) {try {for (int i = 0; i < r.length; i++) {for (int j = j0; j <= j1; j++) {A[r[i]][j] = X.get(i,j-j0);}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}}/** Set a submatrix.@param i0 Initial row index@param i1 Final row index@param c Array of column indices.@param X A(i0:i1,c(:))@exception ArrayIndexOutOfBoundsException Submatrix indices*/public void setMatrix (int i0, int i1, int[] c, Matrix X) {try {for (int i = i0; i <= i1; i++) {for (int j = 0; j < c.length; j++) {A[i][c[j]] = X.get(i-i0,j);}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}}/** Matrix transpose.@return A'*/public Matrix transpose () {Matrix X = new Matrix(n,m);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[j][i] = A[i][j];}}return X;}/** One norm@return maximum column sum.*/public double norm1 () {double f = 0;for (int j = 0; j < n; j++) {double s = 0;for (int i = 0; i < m; i++) {s += Math.abs(A[i][j]);}f = Math.max(f,s);}return f;}/** Two norm@return maximum singular value.*/public double norm2 () {return (new SingularValueDecomposition(this).norm2());}/** Infinity norm@return maximum row sum.*/public double normInf () {double f = 0;for (int i = 0; i < m; i++) {double s = 0;for (int j = 0; j < n; j++) {s += Math.abs(A[i][j]);}f = Math.max(f,s);}return f;}/** Frobenius norm@return sqrt of sum of squares of all elements.*/public double normF () {double f = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {f = Maths.hypot(f,A[i][j]);}}return f;}/** Unary minus@return -A*/public Matrix uminus () {Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = -A[i][j];}}return X;}/** C = A + B@param B another matrix@return A + B*/public Matrix plus (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j] + B.A[i][j];}}return X;}/** A = A + B@param B another matrix@return A + B*/public Matrix plusEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = A[i][j] + B.A[i][j];}}return this;}/** C = A - B@param B another matrix@return A - B*/public Matrix minus (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j] - B.A[i][j];}}return X;}/** A = A - B@param B another matrix@return A - B*/public Matrix minusEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = A[i][j] - B.A[i][j];}}return this;}/** Element-by-element multiplication, C = A.*B@param B another matrix@return A.*B*/public Matrix arrayTimes (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j] * B.A[i][j];}}return X;}/** Element-by-element multiplication in place, A = A.*B@param B another matrix@return A.*B*/public Matrix arrayTimesEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = A[i][j] * B.A[i][j];}}return this;}/** Element-by-element right division, C = A./B@param B another matrix@return A./B*/public Matrix arrayRightDivide (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j] / B.A[i][j];}}return X;}/** Element-by-element right division in place, A = A./B@param B another matrix@return A./B*/public Matrix arrayRightDivideEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = A[i][j] / B.A[i][j];}}return this;}/** Element-by-element left division, C = A.\B@param B another matrix@return A.\B*/public Matrix arrayLeftDivide (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = B.A[i][j] / A[i][j];}}return X;}/** Element-by-element left division in place, A = A.\B@param B another matrix@return A.\B*/public Matrix arrayLeftDivideEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = B.A[i][j] / A[i][j];}}return this;}/** Multiply a matrix by a scalar, C = s*A@param s scalar@return s*A*/public Matrix times (double s) {Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = s*A[i][j];}}return X;}/** Multiply a matrix by a scalar in place, A = s*A@param s scalar@return replace A by s*A*/public Matrix timesEquals (double s) {for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = s*A[i][j];}}return this;}/** Linear algebraic matrix multiplication, A * B@param B another matrix@return Matrix product, A * B@exception IllegalArgumentException Matrix inner dimensions must agree.*/public Matrix times (Matrix B) {if (B.m != n) {throw new IllegalArgumentException("Matrix inner dimensions must agree.");}Matrix X = new Matrix(m,B.n);double[][] C = X.getArray();double[] Bcolj = new double[n];for (int j = 0; j < B.n; j++) {for (int k = 0; k < n; k++) {Bcolj[k] = B.A[k][j];}for (int i = 0; i < m; i++) {double[] Arowi = A[i];double s = 0;for (int k = 0; k < n; k++) {s += Arowi[k]*Bcolj[k];}C[i][j] = s;}}return X;}/** LU Decomposition@return LUDecomposition@see LUDecomposition*/public LUDecomposition lu () {return new LUDecomposition(this);}/** QR Decomposition@return QRDecomposition@see QRDecomposition*/public QRDecomposition qr () {return new QRDecomposition(this);}/** Cholesky Decomposition@return CholeskyDecomposition@see CholeskyDecomposition*/public CholeskyDecomposition chol () {return new CholeskyDecomposition(this);}/** Singular Value Decomposition@return SingularValueDecomposition@see SingularValueDecomposition*/public SingularValueDecomposition svd () {return new SingularValueDecomposition(this);}/** Eigenvalue Decomposition@return EigenvalueDecomposition@see EigenvalueDecomposition*/public EigenvalueDecomposition eig () {return new EigenvalueDecomposition(this);}/** Solve A*X = B@param B right hand side@return solution if A is square, least squares solution otherwise*/public Matrix solve (Matrix B) {return (m == n ? (new LUDecomposition(this)).solve(B) :(new QRDecomposition(this)).solve(B));}/** Solve X*A = B, which is also A'*X' = B'@param B right hand side@return solution if A is square, least squares solution otherwise.*/public Matrix solveTranspose (Matrix B) {return transpose().solve(B.transpose());}/** Matrix inverse or pseudoinverse@return inverse(A) if A is square, pseudoinverse otherwise.*/public Matrix inverse () {return solve(identity(m,m));}/** Matrix determinant@return determinant*/public double det () {return new LUDecomposition(this).det();}/** Matrix rank@return effective numerical rank, obtained from SVD.*/public int rank () {return new SingularValueDecomposition(this).rank();}/** Matrix condition (2 norm)@return ratio of largest to smallest singular value.*/public double cond () {return new SingularValueDecomposition(this).cond();}/** Matrix trace.@return sum of the diagonal elements.*/public double trace () {double t = 0;for (int i = 0; i < Math.min(m,n); i++) {t += A[i][i];}return t;}/** Generate matrix with random elements@param m Number of rows.@param n Number of colums.@return An m-by-n matrix with uniformly distributed random elements.*/public static Matrix random (int m, int n) {Matrix A = new Matrix(m,n);double[][] X = A.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {X[i][j] = Math.random();}}return A;}/** Generate identity matrix@param m Number of rows.@param n Number of colums.@return An m-by-n matrix with ones on the diagonal and zeros elsewhere.*/public static Matrix identity (int m, int n) {Matrix A = new Matrix(m,n);double[][] X = A.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {X[i][j] = (i == j ? 1.0 : 0.0);}}return A;}/** Print the matrix to stdout. Line the elements up in columns* with a Fortran-like 'Fw.d' style format.@param w Column width.@param d Number of digits after the decimal.*/public void print (int w, int d) {print(new PrintWriter(System.out,true),w,d); }/** Print the matrix to the output stream. Line the elements up in* columns with a Fortran-like 'Fw.d' style format.@param output Output stream.@param w Column width.@param d Number of digits after the decimal.*/public void print (PrintWriter output, int w, int d) {DecimalFormat format = new DecimalFormat();format.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));format.setMinimumIntegerDigits(1);format.setMaximumFractionDigits(d);format.setMinimumFractionDigits(d);format.setGroupingUsed(false);print(output,format,w+2);}/** Print the matrix to stdout. Line the elements up in columns.* Use the format object, and right justify within columns of width* characters.* Note that is the matrix is to be read back in, you probably will want* to use a NumberFormat that is set to US Locale.@param format A Formatting object for individual elements.@param width Field width for each column.@see java.text.DecimalFormat#setDecimalFormatSymbols*/public void print (NumberFormat format, int width) {print(new PrintWriter(System.out,true),format,width); }// DecimalFormat is a little disappointing coming from Fortran or C's printf.// Since it doesn't pad on the left, the elements will come out different// widths. Consequently, we'll pass the desired column width in as an// argument and do the extra padding ourselves./** Print the matrix to the output stream. Line the elements up in columns.* Use the format object, and right justify within columns of width* characters.* Note that is the matrix is to be read back in, you probably will want* to use a NumberFormat that is set to US Locale.@param output the output stream.@param format A formatting object to format the matrix elements @param width Column width.@see java.text.DecimalFormat#setDecimalFormatSymbols*/public void print (PrintWriter output, NumberFormat format, int width) {output.println(); // start on new line.for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {String s = format.format(A[i][j]); // format the numberint padding = Math.max(1,width-s.length()); // At _least_ 1 spacefor (int k = 0; k < padding; k++)output.print(' ');output.print(s);}output.println();}output.println(); // end with blank line.}/** Read a matrix from a stream. The format is the same the print method,* so printed matrices can be read back in (provided they were printed using* US Locale). Elements are separated by* whitespace, all the elements for each row appear on a single line,* the last row is followed by a blank line.@param input the input stream.*/public static Matrix read (BufferedReader input) throws java.io.IOException {StreamTokenizer tokenizer= new StreamTokenizer(input);// Although StreamTokenizer will parse numbers, it doesn't recognize// scientific notation (E or D); however, Double.valueOf does.// The strategy here is to disable StreamTokenizer's number parsing.// We'll only get whitespace delimited words, EOL's and EOF's.// These words should all be numbers, for Double.valueOf to parse.tokenizer.resetSyntax();tokenizer.wordChars(0,255);tokenizer.whitespaceChars(0, ' ');tokenizer.eolIsSignificant(true);java.util.Vector<Double> vD = new java.util.Vector<Double>();// Ignore initial empty lineswhile (tokenizer.nextToken() == StreamTokenizer.TT_EOL);if (tokenizer.ttype == StreamTokenizer.TT_EOF)throw new java.io.IOException("Unexpected EOF on matrix read.");do {vD.addElement(Double.valueOf(tokenizer.sval)); // Read & store 1st row.} while (tokenizer.nextToken() == StreamTokenizer.TT_WORD);int n = vD.size(); // Now we've got the number of columns!double row[] = new double[n];for (int j=0; j<n; j++) // extract the elements of the 1st row.row[j]=vD.elementAt(j).doubleValue();java.util.Vector<double[]> v = new java.util.Vector<double[]>();v.addElement(row); // Start storing rows instead of columns.while (tokenizer.nextToken() == StreamTokenizer.TT_WORD) {// While non-empty linesv.addElement(row = new double[n]);int j = 0;do {if (j >= n) throw new java.io.IOException("Row " + v.size() + " is too long.");row[j++] = Double.valueOf(tokenizer.sval).doubleValue();} while (tokenizer.nextToken() == StreamTokenizer.TT_WORD);if (j < n) throw new java.io.IOException("Row " + v.size() + " is too short.");}int m = v.size(); // Now we've got the number of rows.double[][] A = new double[m][];v.copyInto(A); // copy the rows out of the vectorreturn new Matrix(A);}/* ------------------------Private Methods* ------------------------ *//** Check if size(A) == size(B) **/private void checkMatrixDimensions (Matrix B) {if (B.m != m || B.n != n) {throw new IllegalArgumentException("Matrix dimensions must agree.");}}private static final long serialVersionUID = 1; }
package Jama.util;public class Maths {/** sqrt(a^2 + b^2) without under/overflow. **/public 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;} }


package Jama; import Jama.util.*;/** Singular Value Decomposition.<P>For an m-by-n matrix A with m >= n, the singular value decomposition isan m-by-n orthogonal matrix U, an n-by-n diagonal matrix S, andan n-by-n orthogonal matrix V so that A = U*S*V'.<P>The singular values, sigma[k] = S[k][k], are ordered so thatsigma[0] >= sigma[1] >= ... >= sigma[n-1].<P>The singular value decompostion always exists, so the constructor willnever fail. The matrix condition number and the effective numericalrank can be computed from this decomposition.*/public class SingularValueDecomposition implements java.io.Serializable {/* ------------------------Class variables* ------------------------ *//** Arrays for internal storage of U and V.@serial internal storage of U.@serial internal storage of V.*/private double[][] U, V;/** Array for internal storage of singular values.@serial internal storage of singular values.*/private double[] s;/** Row and column dimensions.@serial row dimension.@serial column dimension.*/private int m, n;/* ------------------------Constructor* ------------------------ *//** Construct the singular value decompositionStructure to access U, S and V.@param Arg Rectangular matrix*/public SingularValueDecomposition (Matrix Arg) {// Derived from LINPACK code.// Initialize.double[][] A = Arg.getArrayCopy();m = Arg.getRowDimension();n = Arg.getColumnDimension();/* Apparently the failing cases are only a proper subset of (m<n), so let's not throw error. Correct fix to come later?if (m<n) {throw new IllegalArgumentException("Jama SVD only works for m >= n"); }*/int nu = Math.min(m,n);s = new double [Math.min(m+1,n)];U = new double [m][nu];V = new double [n][n];double[] e = new double [n];double[] work = new double [m];boolean wantu = true;boolean wantv = true;// Reduce A to bidiagonal form, storing the diagonal elements// in s and the super-diagonal elements in e.int nct = Math.min(m-1,n);int nrt = Math.max(0,Math.min(n-2,m));for (int k = 0; k < Math.max(nct,nrt); k++) {if (k < nct) {// Compute the transformation for the k-th column and// place the k-th diagonal in s[k].// Compute 2-norm of k-th column without under/overflow.s[k] = 0;for (int i = k; i < m; i++) {s[k] = Maths.hypot(s[k],A[i][k]);}if (s[k] != 0.0) {if (A[k][k] < 0.0) {s[k] = -s[k];}for (int i = k; i < m; i++) {A[i][k] /= s[k];}A[k][k] += 1.0;}s[k] = -s[k];}for (int j = k+1; j < n; j++) {if ((k < nct) & (s[k] != 0.0)) {// Apply the transformation.double t = 0;for (int i = k; i < m; i++) {t += A[i][k]*A[i][j];}t = -t/A[k][k];for (int i = k; i < m; i++) {A[i][j] += t*A[i][k];}}// Place the k-th row of A into e for the// subsequent calculation of the row transformation.e[j] = A[k][j];}if (wantu & (k < nct)) {// Place the transformation in U for subsequent back// multiplication.for (int i = k; i < m; i++) {U[i][k] = A[i][k];}}if (k < nrt) {// Compute the k-th row transformation and place the// k-th super-diagonal in e[k].// Compute 2-norm without under/overflow.e[k] = 0;for (int i = k+1; i < n; i++) {e[k] = Maths.hypot(e[k],e[i]);}if (e[k] != 0.0) {if (e[k+1] < 0.0) {e[k] = -e[k];}for (int i = k+1; i < n; i++) {e[i] /= e[k];}e[k+1] += 1.0;}e[k] = -e[k];if ((k+1 < m) & (e[k] != 0.0)) {// Apply the transformation.for (int i = k+1; i < m; i++) {work[i] = 0.0;}for (int j = k+1; j < n; j++) {for (int i = k+1; i < m; i++) {work[i] += e[j]*A[i][j];}}for (int j = k+1; j < n; j++) {double t = -e[j]/e[k+1];for (int i = k+1; i < m; i++) {A[i][j] += t*work[i];}}}if (wantv) {// Place the transformation in V for subsequent// back multiplication.for (int i = k+1; i < n; i++) {V[i][k] = e[i];}}}}// Set up the final bidiagonal matrix or order p.int p = Math.min(n,m+1);if (nct < n) {s[nct] = A[nct][nct];}if (m < p) {s[p-1] = 0.0;}if (nrt+1 < p) {e[nrt] = A[nrt][p-1];}e[p-1] = 0.0;// If required, generate U.if (wantu) {for (int j = nct; j < nu; j++) {for (int i = 0; i < m; i++) {U[i][j] = 0.0;}U[j][j] = 1.0;}for (int k = nct-1; k >= 0; k--) {if (s[k] != 0.0) {for (int j = k+1; j < nu; j++) {double t = 0;for (int i = k; i < m; i++) {t += U[i][k]*U[i][j];}t = -t/U[k][k];for (int i = k; i < m; i++) {U[i][j] += t*U[i][k];}}for (int i = k; i < m; i++ ) {U[i][k] = -U[i][k];}U[k][k] = 1.0 + U[k][k];for (int i = 0; i < k-1; i++) {U[i][k] = 0.0;}} else {for (int i = 0; i < m; i++) {U[i][k] = 0.0;}U[k][k] = 1.0;}}}// If required, generate V.if (wantv) {for (int k = n-1; k >= 0; k--) {if ((k < nrt) & (e[k] != 0.0)) {for (int j = k+1; j < nu; j++) {double t = 0;for (int i = k+1; i < n; i++) {t += V[i][k]*V[i][j];}t = -t/V[k+1][k];for (int i = k+1; i < n; i++) {V[i][j] += t*V[i][k];}}}for (int i = 0; i < n; i++) {V[i][k] = 0.0;}V[k][k] = 1.0;}}// Main iteration loop for the singular values.int pp = p-1;int iter = 0;double eps = Math.pow(2.0,-52.0);double tiny = Math.pow(2.0,-966.0);while (p > 0) {int k,kase;// Here is where a test for too many iterations would go.// This section of the program inspects for// negligible elements in the s and e arrays. On// completion the variables kase and k are set as follows.// kase = 1 if s(p) and e[k-1] are negligible and k<p// kase = 2 if s(k) is negligible and k<p// kase = 3 if e[k-1] is negligible, k<p, and// s(k), ..., s(p) are not negligible (qr step).// kase = 4 if e(p-1) is negligible (convergence).for (k = p-2; k >= -1; k--) {if (k == -1) {break;}if (Math.abs(e[k]) <=tiny + eps*(Math.abs(s[k]) + Math.abs(s[k+1]))) {e[k] = 0.0;break;}}if (k == p-2) {kase = 4;} else {int ks;for (ks = p-1; ks >= k; ks--) {if (ks == k) {break;}double t = (ks != p ? Math.abs(e[ks]) : 0.) + (ks != k+1 ? Math.abs(e[ks-1]) : 0.);if (Math.abs(s[ks]) <= tiny + eps*t) {s[ks] = 0.0;break;}}if (ks == k) {kase = 3;} else if (ks == p-1) {kase = 1;} else {kase = 2;k = ks;}}k++;// Perform the task indicated by kase.switch (kase) {// Deflate negligible s(p).case 1: {double f = e[p-2];e[p-2] = 0.0;for (int j = p-2; j >= k; j--) {double t = Maths.hypot(s[j],f);double cs = s[j]/t;double sn = f/t;s[j] = t;if (j != k) {f = -sn*e[j-1];e[j-1] = cs*e[j-1];}if (wantv) {for (int i = 0; i < n; i++) {t = cs*V[i][j] + sn*V[i][p-1];V[i][p-1] = -sn*V[i][j] + cs*V[i][p-1];V[i][j] = t;}}}}break;// Split at negligible s(k).case 2: {double f = e[k-1];e[k-1] = 0.0;for (int j = k; j < p; j++) {double t = Maths.hypot(s[j],f);double cs = s[j]/t;double sn = f/t;s[j] = t;f = -sn*e[j];e[j] = cs*e[j];if (wantu) {for (int i = 0; i < m; i++) {t = cs*U[i][j] + sn*U[i][k-1];U[i][k-1] = -sn*U[i][j] + cs*U[i][k-1];U[i][j] = t;}}}}break;// Perform one qr step.case 3: {// Calculate the shift.double scale = Math.max(Math.max(Math.max(Math.max(Math.abs(s[p-1]),Math.abs(s[p-2])),Math.abs(e[p-2])), Math.abs(s[k])),Math.abs(e[k]));double sp = s[p-1]/scale;double spm1 = s[p-2]/scale;double epm1 = e[p-2]/scale;double sk = s[k]/scale;double ek = e[k]/scale;double b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/2.0;double c = (sp*epm1)*(sp*epm1);double shift = 0.0;if ((b != 0.0) | (c != 0.0)) {shift = Math.sqrt(b*b + c);if (b < 0.0) {shift = -shift;}shift = c/(b + shift);}double f = (sk + sp)*(sk - sp) + shift;double g = sk*ek;// Chase zeros.for (int j = k; j < p-1; j++) {double t = Maths.hypot(f,g);double cs = f/t;double sn = g/t;if (j != k) {e[j-1] = t;}f = cs*s[j] + sn*e[j];e[j] = cs*e[j] - sn*s[j];g = sn*s[j+1];s[j+1] = cs*s[j+1];if (wantv) {for (int i = 0; i < n; i++) {t = cs*V[i][j] + sn*V[i][j+1];V[i][j+1] = -sn*V[i][j] + cs*V[i][j+1];V[i][j] = t;}}t = Maths.hypot(f,g);cs = f/t;sn = g/t;s[j] = t;f = cs*e[j] + sn*s[j+1];s[j+1] = -sn*e[j] + cs*s[j+1];g = sn*e[j+1];e[j+1] = cs*e[j+1];if (wantu && (j < m-1)) {for (int i = 0; i < m; i++) {t = cs*U[i][j] + sn*U[i][j+1];U[i][j+1] = -sn*U[i][j] + cs*U[i][j+1];U[i][j] = t;}}}e[p-2] = f;iter = iter + 1;}break;// Convergence.case 4: {// Make the singular values positive.if (s[k] <= 0.0) {s[k] = (s[k] < 0.0 ? -s[k] : 0.0);if (wantv) {for (int i = 0; i <= pp; i++) {V[i][k] = -V[i][k];}}}// Order the singular values.while (k < pp) {if (s[k] >= s[k+1]) {break;}double t = s[k];s[k] = s[k+1];s[k+1] = t;if (wantv && (k < n-1)) {for (int i = 0; i < n; i++) {t = V[i][k+1]; V[i][k+1] = V[i][k]; V[i][k] = t;}}if (wantu && (k < m-1)) {for (int i = 0; i < m; i++) {t = U[i][k+1]; U[i][k+1] = U[i][k]; U[i][k] = t;}}k++;}iter = 0;p--;}break;}}}/* ------------------------Public Methods* ------------------------ *//** Return the left singular vectors@return U*/public Matrix getU () {return new Matrix(U,m,Math.min(m+1,n));}/** Return the right singular vectors@return V*/public Matrix getV () {return new Matrix(V,n,n);}/** Return the one-dimensional array of singular values@return diagonal of S.*/public double[] getSingularValues () {return s;}/** Return the diagonal matrix of singular values@return S*/public Matrix getS () {Matrix X = new Matrix(n,n);double[][] S = X.getArray();for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {S[i][j] = 0.0;}S[i][i] = this.s[i];}return X;}/** Two norm@return max(S)*/public double norm2 () {return s[0];}/** Two norm condition number@return max(S)/min(S)*/public double cond () {return s[0]/s[Math.min(m,n)-1];}/** Effective numerical matrix rank@return Number of nonnegligible singular values.*/public int rank () {double eps = Math.pow(2.0,-52.0);double tol = Math.max(m,n)*s[0]*eps;int r = 0;for (int i = 0; i < s.length; i++) {if (s[i] > tol) {r++;}}return r;}private static final long serialVersionUID = 1; }
package Jama; import Jama.util.*;/** QR Decomposition. <P>For an m-by-n matrix A with m >= n, the QR decomposition is an m-by-northogonal matrix Q and an n-by-n upper triangular matrix R so thatA = Q*R. <P>The QR decompostion always exists, even if the matrix does not havefull rank, so the constructor will never fail. The primary use of theQR decomposition is in the least squares solution of nonsquare systemsof simultaneous linear equations. This will fail if isFullRank()returns false. */public class QRDecomposition implements java.io.Serializable {/* ------------------------Class variables* ------------------------ *//** Array for internal storage of decomposition.@serial internal array storage.*/private double[][] QR;/** Row and column dimensions.@serial column dimension.@serial row dimension.*/private int m, n;/** Array for internal storage of diagonal of R.@serial diagonal of R.*/private double[] Rdiag;/* ------------------------Constructor* ------------------------ *//** QR Decomposition, computed by Householder reflections.Structure to access R and the Householder vectors and compute Q.@param A Rectangular matrix*/public QRDecomposition (Matrix A) {// Initialize.QR = A.getArrayCopy();m = A.getRowDimension();n = A.getColumnDimension();Rdiag = new double[n];// Main loop.for (int k = 0; k < n; k++) {// Compute 2-norm of k-th column without under/overflow.double nrm = 0;for (int i = k; i < m; i++) {nrm = Maths.hypot(nrm,QR[i][k]);}if (nrm != 0.0) {// Form k-th Householder vector.if (QR[k][k] < 0) {nrm = -nrm;}for (int i = k; i < m; i++) {QR[i][k] /= nrm;}QR[k][k] += 1.0;// Apply transformation to remaining columns.for (int j = k+1; j < n; j++) {double s = 0.0; for (int i = k; i < m; i++) {s += QR[i][k]*QR[i][j];}s = -s/QR[k][k];for (int i = k; i < m; i++) {QR[i][j] += s*QR[i][k];}}}Rdiag[k] = -nrm;}}/* ------------------------Public Methods* ------------------------ *//** Is the matrix full rank?@return true if R, and hence A, has full rank.*/public boolean isFullRank () {for (int j = 0; j < n; j++) {if (Rdiag[j] == 0)return false;}return true;}/** Return the Householder vectors@return Lower trapezoidal matrix whose columns define the reflections*/public Matrix getH () {Matrix X = new Matrix(m,n);double[][] H = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (i >= j) {H[i][j] = QR[i][j];} else {H[i][j] = 0.0;}}}return X;}/** Return the upper triangular factor@return R*/public Matrix getR () {Matrix X = new Matrix(n,n);double[][] R = X.getArray();for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i < j) {R[i][j] = QR[i][j];} else if (i == j) {R[i][j] = Rdiag[i];} else {R[i][j] = 0.0;}}}return X;}/** Generate and return the (economy-sized) orthogonal factor@return Q*/public Matrix getQ () {Matrix X = new Matrix(m,n);double[][] Q = X.getArray();for (int k = n-1; k >= 0; k--) {for (int i = 0; i < m; i++) {Q[i][k] = 0.0;}Q[k][k] = 1.0;for (int j = k; j < n; j++) {if (QR[k][k] != 0) {double s = 0.0;for (int i = k; i < m; i++) {s += QR[i][k]*Q[i][j];}s = -s/QR[k][k];for (int i = k; i < m; i++) {Q[i][j] += s*QR[i][k];}}}}return X;}/** Least squares solution of A*X = B@param B A Matrix with as many rows as A and any number of columns.@return X that minimizes the two norm of Q*R*X-B.@exception IllegalArgumentException Matrix row dimensions must agree.@exception RuntimeException Matrix is rank deficient.*/public Matrix solve (Matrix B) {if (B.getRowDimension() != m) {throw new IllegalArgumentException("Matrix row dimensions must agree.");}if (!this.isFullRank()) {throw new RuntimeException("Matrix is rank deficient.");}// Copy right hand sideint nx = B.getColumnDimension();double[][] X = B.getArrayCopy();// Compute Y = transpose(Q)*Bfor (int k = 0; k < n; k++) {for (int j = 0; j < nx; j++) {double s = 0.0; for (int i = k; i < m; i++) {s += QR[i][k]*X[i][j];}s = -s/QR[k][k];for (int i = k; i < m; i++) {X[i][j] += s*QR[i][k];}}}// Solve R*X = Y;for (int k = n-1; k >= 0; k--) {for (int j = 0; j < nx; j++) {X[k][j] /= Rdiag[k];}for (int i = 0; i < k; i++) {for (int j = 0; j < nx; j++) {X[i][j] -= X[k][j]*QR[i][k];}}}return (new Matrix(X,n,nx).getMatrix(0,n-1,0,nx-1));}private static final long serialVersionUID = 1; }
package Jama;/** LU Decomposition.<P>For an m-by-n matrix A with m >= n, the LU decomposition is an m-by-nunit lower triangular matrix L, an n-by-n upper triangular matrix U,and a permutation vector piv of length m so that A(piv,:) = L*U.If m < n, then L is m-by-m and U is m-by-n.<P>The LU decompostion with pivoting always exists, even if the matrix issingular, so the constructor will never fail. The primary use of theLU decomposition is in the solution of square systems of simultaneouslinear equations. This will fail if isNonsingular() returns false.*/public class LUDecomposition implements java.io.Serializable {/* ------------------------Class variables* ------------------------ *//** Array for internal storage of decomposition.@serial internal array storage.*/private double[][] LU;/** Row and column dimensions, and pivot sign.@serial column dimension.@serial row dimension.@serial pivot sign.*/private int m, n, pivsign; /** Internal storage of pivot vector.@serial pivot vector.*/private int[] piv;/* ------------------------Constructor* ------------------------ *//** LU DecompositionStructure to access L, U and piv.@param A Rectangular matrix*/public LUDecomposition (Matrix A) {// Use a "left-looking", dot-product, Crout/Doolittle algorithm.LU = A.getArrayCopy();m = A.getRowDimension();n = A.getColumnDimension();piv = new int[m];for (int i = 0; i < m; i++) {piv[i] = i;}pivsign = 1;double[] LUrowi;double[] LUcolj = new double[m];// Outer loop.for (int j = 0; j < n; j++) {// Make a copy of the j-th column to localize references.for (int i = 0; i < m; i++) {LUcolj[i] = LU[i][j];}// Apply previous transformations.for (int i = 0; i < m; i++) {LUrowi = LU[i];// Most of the time is spent in the following dot product.int kmax = Math.min(i,j);double s = 0.0;for (int k = 0; k < kmax; k++) {s += LUrowi[k]*LUcolj[k];}LUrowi[j] = LUcolj[i] -= s;}// Find pivot and exchange if necessary.int p = j;for (int i = j+1; i < m; i++) {if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {p = i;}}if (p != j) {for (int k = 0; k < n; k++) {double t = LU[p][k]; LU[p][k] = LU[j][k]; LU[j][k] = t;}int k = piv[p]; piv[p] = piv[j]; piv[j] = k;pivsign = -pivsign;}// Compute multipliers.if (j < m & LU[j][j] != 0.0) {for (int i = j+1; i < m; i++) {LU[i][j] /= LU[j][j];}}}}/* ------------------------Temporary, experimental code.------------------------ *\\** LU Decomposition, computed by Gaussian elimination.<P>This constructor computes L and U with the "daxpy"-based eliminationalgorithm used in LINPACK and MATLAB. In Java, we suspect the dot-product,Crout algorithm will be faster. We have temporarily included thisconstructor until timing experiments confirm this suspicion.<P>@param A Rectangular matrix@param linpackflag Use Gaussian elimination. Actual value ignored.@return Structure to access L, U and piv.*\public LUDecomposition (Matrix A, int linpackflag) {// Initialize.LU = A.getArrayCopy();m = A.getRowDimension();n = A.getColumnDimension();piv = new int[m];for (int i = 0; i < m; i++) {piv[i] = i;}pivsign = 1;// Main loop.for (int k = 0; k < n; k++) {// Find pivot.int p = k;for (int i = k+1; i < m; i++) {if (Math.abs(LU[i][k]) > Math.abs(LU[p][k])) {p = i;}}// Exchange if necessary.if (p != k) {for (int j = 0; j < n; j++) {double t = LU[p][j]; LU[p][j] = LU[k][j]; LU[k][j] = t;}int t = piv[p]; piv[p] = piv[k]; piv[k] = t;pivsign = -pivsign;}// Compute multipliers and eliminate k-th column.if (LU[k][k] != 0.0) {for (int i = k+1; i < m; i++) {LU[i][k] /= LU[k][k];for (int j = k+1; j < n; j++) {LU[i][j] -= LU[i][k]*LU[k][j];}}}}}\* ------------------------End of temporary code.* ------------------------ *//* ------------------------Public Methods* ------------------------ *//** Is the matrix nonsingular?@return true if U, and hence A, is nonsingular.*/public boolean isNonsingular () {for (int j = 0; j < n; j++) {if (LU[j][j] == 0)return false;}return true;}/** Return lower triangular factor@return L*/public Matrix getL () {Matrix X = new Matrix(m,n);double[][] L = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (i > j) {L[i][j] = LU[i][j];} else if (i == j) {L[i][j] = 1.0;} else {L[i][j] = 0.0;}}}return X;}/** Return upper triangular factor@return U*/public Matrix getU () {Matrix X = new Matrix(n,n);double[][] U = X.getArray();for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i <= j) {U[i][j] = LU[i][j];} else {U[i][j] = 0.0;}}}return X;}/** Return pivot permutation vector@return piv*/public int[] getPivot () {int[] p = new int[m];for (int i = 0; i < m; i++) {p[i] = piv[i];}return p;}/** Return pivot permutation vector as a one-dimensional double array@return (double) piv*/public double[] getDoublePivot () {double[] vals = new double[m];for (int i = 0; i < m; i++) {vals[i] = (double) piv[i];}return vals;}/** Determinant@return det(A)@exception IllegalArgumentException Matrix must be square*/public double det () {if (m != n) {throw new IllegalArgumentException("Matrix must be square.");}double d = (double) pivsign;for (int j = 0; j < n; j++) {d *= LU[j][j];}return d;}/** Solve A*X = B@param B A Matrix with as many rows as A and any number of columns.@return X so that L*U*X = B(piv,:)@exception IllegalArgumentException Matrix row dimensions must agree.@exception RuntimeException Matrix is singular.*/public Matrix solve (Matrix B) {if (B.getRowDimension() != m) {throw new IllegalArgumentException("Matrix row dimensions must agree.");}if (!this.isNonsingular()) {throw new RuntimeException("Matrix is singular.");}// Copy right hand side with pivotingint nx = B.getColumnDimension();Matrix Xmat = B.getMatrix(piv,0,nx-1);double[][] X = Xmat.getArray();// Solve L*Y = B(piv,:)for (int k = 0; k < n; k++) {for (int i = k+1; i < n; i++) {for (int j = 0; j < nx; j++) {X[i][j] -= X[k][j]*LU[i][k];}}}// Solve U*X = Y;for (int k = n-1; k >= 0; k--) {for (int j = 0; j < nx; j++) {X[k][j] /= LU[k][k];}for (int i = 0; i < k; i++) {for (int j = 0; j < nx; j++) {X[i][j] -= X[k][j]*LU[i][k];}}}return Xmat;}private static final long serialVersionUID = 1; }
package Jama;/** Cholesky Decomposition.<P>For a symmetric, positive definite matrix A, the Cholesky decompositionis an lower triangular matrix L so that A = L*L'.<P>If the matrix is not symmetric or positive definite, the constructorreturns a partial decomposition and sets an internal flag that maybe queried by the isSPD() method.*/public class CholeskyDecomposition implements java.io.Serializable {/* ------------------------Class variables* ------------------------ *//** Array for internal storage of decomposition.@serial internal array storage.*/private double[][] L;/** Row and column dimension (square matrix).@serial matrix dimension.*/private int n;/** Symmetric and positive definite flag.@serial is symmetric and positive definite flag.*/private boolean isspd;/* ------------------------Constructor* ------------------------ *//** Cholesky algorithm for symmetric and positive definite matrix.Structure to access L and isspd flag.@param Arg Square, symmetric matrix.*/public CholeskyDecomposition (Matrix Arg) {// Initialize.double[][] A = Arg.getArray();n = Arg.getRowDimension();L = new double[n][n];isspd = (Arg.getColumnDimension() == n);// Main loop.for (int j = 0; j < n; j++) {double[] Lrowj = L[j];double d = 0.0;for (int k = 0; k < j; k++) {double[] Lrowk = L[k];double s = 0.0;for (int i = 0; i < k; i++) {s += Lrowk[i]*Lrowj[i];}Lrowj[k] = s = (A[j][k] - s)/L[k][k];d = d + s*s;isspd = isspd & (A[k][j] == A[j][k]); }d = A[j][j] - d;isspd = isspd & (d > 0.0);L[j][j] = Math.sqrt(Math.max(d,0.0));for (int k = j+1; k < n; k++) {L[j][k] = 0.0;}}}/* ------------------------Temporary, experimental code.* ------------------------ *\\** Right Triangular Cholesky Decomposition.<P>For a symmetric, positive definite matrix A, the Right Choleskydecomposition is an upper triangular matrix R so that A = R'*R.This constructor computes R with the Fortran inspired column orientedalgorithm used in LINPACK and MATLAB. In Java, we suspect a row oriented,lower triangular decomposition is faster. We have temporarily includedthis constructor here until timing experiments confirm this suspicion.*\\** Array for internal storage of right triangular decomposition. **\private transient double[][] R;\** Cholesky algorithm for symmetric and positive definite matrix.@param A Square, symmetric matrix.@param rightflag Actual value ignored.@return Structure to access R and isspd flag.*\public CholeskyDecomposition (Matrix Arg, int rightflag) {// Initialize.double[][] A = Arg.getArray();n = Arg.getColumnDimension();R = new double[n][n];isspd = (Arg.getColumnDimension() == n);// Main loop.for (int j = 0; j < n; j++) {double d = 0.0;for (int k = 0; k < j; k++) {double s = A[k][j];for (int i = 0; i < k; i++) {s = s - R[i][k]*R[i][j];}R[k][j] = s = s/R[k][k];d = d + s*s;isspd = isspd & (A[k][j] == A[j][k]); }d = A[j][j] - d;isspd = isspd & (d > 0.0);R[j][j] = Math.sqrt(Math.max(d,0.0));for (int k = j+1; k < n; k++) {R[k][j] = 0.0;}}}\** Return upper triangular factor.@return R*\public Matrix getR () {return new Matrix(R,n,n);}\* ------------------------End of temporary code.* ------------------------ *//* ------------------------Public Methods* ------------------------ *//** Is the matrix symmetric and positive definite?@return true if A is symmetric and positive definite.*/public boolean isSPD () {return isspd;}/** Return triangular factor.@return L*/public Matrix getL () {return new Matrix(L,n,n);}/** Solve A*X = B@param B A Matrix with as many rows as A and any number of columns.@return X so that L*L'*X = B@exception IllegalArgumentException Matrix row dimensions must agree.@exception RuntimeException Matrix is not symmetric positive definite.*/public Matrix solve (Matrix B) {if (B.getRowDimension() != n) {throw new IllegalArgumentException("Matrix row dimensions must agree.");}if (!isspd) {throw new RuntimeException("Matrix is not symmetric positive definite.");}// Copy right hand side.double[][] X = B.getArrayCopy();int nx = B.getColumnDimension();// Solve L*Y = B;for (int k = 0; k < n; k++) {for (int j = 0; j < nx; j++) {for (int i = 0; i < k ; i++) {X[k][j] -= X[i][j]*L[k][i];}X[k][j] /= L[k][k];}}// Solve L'*X = Y;for (int k = n-1; k >= 0; k--) {for (int j = 0; j < nx; j++) {for (int i = k+1; i < n ; i++) {X[k][j] -= X[i][j]*L[i][k];}X[k][j] /= L[k][k];}}return new Matrix(X,n,nx);}private static final long serialVersionUID = 1;}
package Jama; import Jama.util.*;/** Eigenvalues and eigenvectors of a real matrix. <P>If A is symmetric, then A = V*D*V' where the eigenvalue matrix D isdiagonal and the eigenvector matrix V is orthogonal.I.e. A = V.times(D.times(V.transpose())) and V.times(V.transpose()) equals the identity matrix. <P>If A is not symmetric, then the eigenvalue matrix D is block diagonalwith the real eigenvalues in 1-by-1 blocks and any complex eigenvalues,lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. Thecolumns of V represent the eigenvectors in the sense that A*V = V*D,i.e. A.times(V) equals V.times(D). The matrix V may be badlyconditioned, or even singular, so the validity of the equationA = V*D*inverse(V) depends upon V.cond(). **/public class EigenvalueDecomposition implements java.io.Serializable {/* ------------------------Class variables* ------------------------ *//** Row and column dimension (square matrix).@serial matrix dimension.*/private int n;/** Symmetry flag.@serial internal symmetry flag.*/private boolean issymmetric;/** Arrays for internal storage of eigenvalues.@serial internal storage of eigenvalues.*/private double[] d, e;/** Array for internal storage of eigenvectors.@serial internal storage of eigenvectors.*/private double[][] V;/** Array for internal storage of nonsymmetric Hessenberg form.@serial internal storage of nonsymmetric Hessenberg form.*/private double[][] H;/** Working storage for nonsymmetric algorithm.@serial working storage for nonsymmetric algorithm.*/private double[] ort;/* ------------------------Private Methods* ------------------------ */// Symmetric Householder reduction to tridiagonal form.private void tred2 () {// This is derived from the Algol procedures tred2 by// Bowdler, Martin, Reinsch, and Wilkinson, Handbook for// Auto. Comp., Vol.ii-Linear Algebra, and the corresponding// Fortran subroutine in EISPACK.for (int j = 0; j < n; j++) {d[j] = V[n-1][j];}// Householder reduction to tridiagonal form.for (int i = n-1; i > 0; i--) {// Scale to avoid under/overflow.double scale = 0.0;double h = 0.0;for (int k = 0; k < i; k++) {scale = scale + Math.abs(d[k]);}if (scale == 0.0) {e[i] = d[i-1];for (int j = 0; j < i; j++) {d[j] = V[i-1][j];V[i][j] = 0.0;V[j][i] = 0.0;}} 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;}// 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;}}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;} // Symmetric tridiagonal QL algorithm.private void tql2 () {// 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 elementtst1 = 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 shiftdouble g = d[l];double p = (d[l+1] - g) / (2.0 * e[l]);double r = Maths.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 = Maths.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;}}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;}}}}// Nonsymmetric reduction to Hessenberg form.private void orthes () {// This is derived from the Algol procedures orthes and ortran,// by Martin and Wilkinson, Handbook for Auto. Comp.,// Vol.ii-Linear Algebra, and the corresponding// Fortran subroutines in EISPACK.int low = 0;int high = n-1;for (int m = low+1; m <= high-1; m++) {// Scale column.double scale = 0.0;for (int i = m; i <= high; i++) {scale = scale + Math.abs(H[i][m-1]);}if (scale != 0.0) {// Compute Householder transformation.double h = 0.0;for (int i = high; i >= m; i--) {ort[i] = H[i][m-1]/scale;h += ort[i] * ort[i];}double g = Math.sqrt(h);if (ort[m] > 0) {g = -g;}h = h - ort[m] * g;ort[m] = ort[m] - g;// Apply Householder similarity transformation// H = (I-u*u'/h)*H*(I-u*u')/h)for (int j = m; j < n; j++) {double f = 0.0;for (int i = high; i >= m; i--) {f += ort[i]*H[i][j];}f = f/h;for (int i = m; i <= high; i++) {H[i][j] -= f*ort[i];}}for (int i = 0; i <= high; i++) {double f = 0.0;for (int j = high; j >= m; j--) {f += ort[j]*H[i][j];}f = f/h;for (int j = m; j <= high; j++) {H[i][j] -= f*ort[j];}}ort[m] = scale*ort[m];H[m][m-1] = scale*g;}}// Accumulate transformations (Algol's ortran).for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {V[i][j] = (i == j ? 1.0 : 0.0);}}for (int m = high-1; m >= low+1; m--) {if (H[m][m-1] != 0.0) {for (int i = m+1; i <= high; i++) {ort[i] = H[i][m-1];}for (int j = m; j <= high; j++) {double g = 0.0;for (int i = m; i <= high; i++) {g += ort[i] * V[i][j];}// Double division avoids possible underflowg = (g / ort[m]) / H[m][m-1];for (int i = m; i <= high; i++) {V[i][j] += g * ort[i];}}}}}// Complex scalar division.private transient double cdivr, cdivi;private void cdiv(double xr, double xi, double yr, double yi) {double r,d;if (Math.abs(yr) > Math.abs(yi)) {r = yi/yr;d = yr + r*yi;cdivr = (xr + r*xi)/d;cdivi = (xi - r*xr)/d;} else {r = yr/yi;d = yi + r*yr;cdivr = (r*xr + xi)/d;cdivi = (r*xi - xr)/d;}}// Nonsymmetric reduction from Hessenberg to real Schur form.private void hqr2 () {// This is derived from the Algol procedure hqr2,// by Martin and Wilkinson, Handbook for Auto. Comp.,// Vol.ii-Linear Algebra, and the corresponding// Fortran subroutine in EISPACK.// Initializeint nn = this.n;int n = nn-1;int low = 0;int high = nn-1;double eps = Math.pow(2.0,-52.0);double exshift = 0.0;double p=0,q=0,r=0,s=0,z=0,t,w,x,y;// Store roots isolated by balanc and compute matrix normdouble norm = 0.0;for (int i = 0; i < nn; i++) {if (i < low | i > high) {d[i] = H[i][i];e[i] = 0.0;}for (int j = Math.max(i-1,0); j < nn; j++) {norm = norm + Math.abs(H[i][j]);}}// Outer loop over eigenvalue indexint iter = 0;while (n >= low) {// Look for single small sub-diagonal elementint l = n;while (l > low) {s = Math.abs(H[l-1][l-1]) + Math.abs(H[l][l]);if (s == 0.0) {s = norm;}if (Math.abs(H[l][l-1]) < eps * s) {break;}l--;}// Check for convergence// One root foundif (l == n) {H[n][n] = H[n][n] + exshift;d[n] = H[n][n];e[n] = 0.0;n--;iter = 0;// Two roots found} else if (l == n-1) {w = H[n][n-1] * H[n-1][n];p = (H[n-1][n-1] - H[n][n]) / 2.0;q = p * p + w;z = Math.sqrt(Math.abs(q));H[n][n] = H[n][n] + exshift;H[n-1][n-1] = H[n-1][n-1] + exshift;x = H[n][n];// Real pairif (q >= 0) {if (p >= 0) {z = p + z;} else {z = p - z;}d[n-1] = x + z;d[n] = d[n-1];if (z != 0.0) {d[n] = x - w / z;}e[n-1] = 0.0;e[n] = 0.0;x = H[n][n-1];s = Math.abs(x) + Math.abs(z);p = x / s;q = z / s;r = Math.sqrt(p * p+q * q);p = p / r;q = q / r;// Row modificationfor (int j = n-1; j < nn; j++) {z = H[n-1][j];H[n-1][j] = q * z + p * H[n][j];H[n][j] = q * H[n][j] - p * z;}// Column modificationfor (int i = 0; i <= n; i++) {z = H[i][n-1];H[i][n-1] = q * z + p * H[i][n];H[i][n] = q * H[i][n] - p * z;}// Accumulate transformationsfor (int i = low; i <= high; i++) {z = V[i][n-1];V[i][n-1] = q * z + p * V[i][n];V[i][n] = q * V[i][n] - p * z;}// Complex pair} else {d[n-1] = x + p;d[n] = x + p;e[n-1] = z;e[n] = -z;}n = n - 2;iter = 0;// No convergence yet} else {// Form shiftx = H[n][n];y = 0.0;w = 0.0;if (l < n) {y = H[n-1][n-1];w = H[n][n-1] * H[n-1][n];}// Wilkinson's original ad hoc shiftif (iter == 10) {exshift += x;for (int i = low; i <= n; i++) {H[i][i] -= x;}s = Math.abs(H[n][n-1]) + Math.abs(H[n-1][n-2]);x = y = 0.75 * s;w = -0.4375 * s * s;}// MATLAB's new ad hoc shiftif (iter == 30) {s = (y - x) / 2.0;s = s * s + w;if (s > 0) {s = Math.sqrt(s);if (y < x) {s = -s;}s = x - w / ((y - x) / 2.0 + s);for (int i = low; i <= n; i++) {H[i][i] -= s;}exshift += s;x = y = w = 0.964;}}iter = iter + 1; // (Could check iteration count here.)// Look for two consecutive small sub-diagonal elementsint m = n-2;while (m >= l) {z = H[m][m];r = x - z;s = y - z;p = (r * s - w) / H[m+1][m] + H[m][m+1];q = H[m+1][m+1] - z - r - s;r = H[m+2][m+1];s = Math.abs(p) + Math.abs(q) + Math.abs(r);p = p / s;q = q / s;r = r / s;if (m == l) {break;}if (Math.abs(H[m][m-1]) * (Math.abs(q) + Math.abs(r)) <eps * (Math.abs(p) * (Math.abs(H[m-1][m-1]) + Math.abs(z) +Math.abs(H[m+1][m+1])))) {break;}m--;}for (int i = m+2; i <= n; i++) {H[i][i-2] = 0.0;if (i > m+2) {H[i][i-3] = 0.0;}}// Double QR step involving rows l:n and columns m:nfor (int k = m; k <= n-1; k++) {boolean notlast = (k != n-1);if (k != m) {p = H[k][k-1];q = H[k+1][k-1];r = (notlast ? H[k+2][k-1] : 0.0);x = Math.abs(p) + Math.abs(q) + Math.abs(r);if (x == 0.0) {continue;}p = p / x;q = q / x;r = r / x;}s = Math.sqrt(p * p + q * q + r * r);if (p < 0) {s = -s;}if (s != 0) {if (k != m) {H[k][k-1] = -s * x;} else if (l != m) {H[k][k-1] = -H[k][k-1];}p = p + s;x = p / s;y = q / s;z = r / s;q = q / p;r = r / p;// Row modificationfor (int j = k; j < nn; j++) {p = H[k][j] + q * H[k+1][j];if (notlast) {p = p + r * H[k+2][j];H[k+2][j] = H[k+2][j] - p * z;}H[k][j] = H[k][j] - p * x;H[k+1][j] = H[k+1][j] - p * y;}// Column modificationfor (int i = 0; i <= Math.min(n,k+3); i++) {p = x * H[i][k] + y * H[i][k+1];if (notlast) {p = p + z * H[i][k+2];H[i][k+2] = H[i][k+2] - p * r;}H[i][k] = H[i][k] - p;H[i][k+1] = H[i][k+1] - p * q;}// Accumulate transformationsfor (int i = low; i <= high; i++) {p = x * V[i][k] + y * V[i][k+1];if (notlast) {p = p + z * V[i][k+2];V[i][k+2] = V[i][k+2] - p * r;}V[i][k] = V[i][k] - p;V[i][k+1] = V[i][k+1] - p * q;}} // (s != 0)} // k loop} // check convergence} // while (n >= low)// Backsubstitute to find vectors of upper triangular formif (norm == 0.0) {return;}for (n = nn-1; n >= 0; n--) {p = d[n];q = e[n];// Real vectorif (q == 0) {int l = n;H[n][n] = 1.0;for (int i = n-1; i >= 0; i--) {w = H[i][i] - p;r = 0.0;for (int j = l; j <= n; j++) {r = r + H[i][j] * H[j][n];}if (e[i] < 0.0) {z = w;s = r;} else {l = i;if (e[i] == 0.0) {if (w != 0.0) {H[i][n] = -r / w;} else {H[i][n] = -r / (eps * norm);}// Solve real equations} else {x = H[i][i+1];y = H[i+1][i];q = (d[i] - p) * (d[i] - p) + e[i] * e[i];t = (x * s - z * r) / q;H[i][n] = t;if (Math.abs(x) > Math.abs(z)) {H[i+1][n] = (-r - w * t) / x;} else {H[i+1][n] = (-s - y * t) / z;}}// Overflow controlt = Math.abs(H[i][n]);if ((eps * t) * t > 1) {for (int j = i; j <= n; j++) {H[j][n] = H[j][n] / t;}}}}// Complex vector} else if (q < 0) {int l = n-1;// Last vector component imaginary so matrix is triangularif (Math.abs(H[n][n-1]) > Math.abs(H[n-1][n])) {H[n-1][n-1] = q / H[n][n-1];H[n-1][n] = -(H[n][n] - p) / H[n][n-1];} else {cdiv(0.0,-H[n-1][n],H[n-1][n-1]-p,q);H[n-1][n-1] = cdivr;H[n-1][n] = cdivi;}H[n][n-1] = 0.0;H[n][n] = 1.0;for (int i = n-2; i >= 0; i--) {double ra,sa,vr,vi;ra = 0.0;sa = 0.0;for (int j = l; j <= n; j++) {ra = ra + H[i][j] * H[j][n-1];sa = sa + H[i][j] * H[j][n];}w = H[i][i] - p;if (e[i] < 0.0) {z = w;r = ra;s = sa;} else {l = i;if (e[i] == 0) {cdiv(-ra,-sa,w,q);H[i][n-1] = cdivr;H[i][n] = cdivi;} else {// Solve complex equationsx = H[i][i+1];y = H[i+1][i];vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;vi = (d[i] - p) * 2.0 * q;if (vr == 0.0 & vi == 0.0) {vr = eps * norm * (Math.abs(w) + Math.abs(q) +Math.abs(x) + Math.abs(y) + Math.abs(z));}cdiv(x*r-z*ra+q*sa,x*s-z*sa-q*ra,vr,vi);H[i][n-1] = cdivr;H[i][n] = cdivi;if (Math.abs(x) > (Math.abs(z) + Math.abs(q))) {H[i+1][n-1] = (-ra - w * H[i][n-1] + q * H[i][n]) / x;H[i+1][n] = (-sa - w * H[i][n] - q * H[i][n-1]) / x;} else {cdiv(-r-y*H[i][n-1],-s-y*H[i][n],z,q);H[i+1][n-1] = cdivr;H[i+1][n] = cdivi;}}// Overflow controlt = Math.max(Math.abs(H[i][n-1]),Math.abs(H[i][n]));if ((eps * t) * t > 1) {for (int j = i; j <= n; j++) {H[j][n-1] = H[j][n-1] / t;H[j][n] = H[j][n] / t;}}}}}}// Vectors of isolated rootsfor (int i = 0; i < nn; i++) {if (i < low | i > high) {for (int j = i; j < nn; j++) {V[i][j] = H[i][j];}}}// Back transformation to get eigenvectors of original matrixfor (int j = nn-1; j >= low; j--) {for (int i = low; i <= high; i++) {z = 0.0;for (int k = low; k <= Math.min(j,high); k++) {z = z + V[i][k] * H[k][j];}V[i][j] = z;}}}/* ------------------------Constructor* ------------------------ *//** Check for symmetry, then construct the eigenvalue decompositionStructure to access D and V.@param Arg Square matrix*/public EigenvalueDecomposition (Matrix Arg) {double[][] A = Arg.getArray();n = Arg.getColumnDimension();V = new double[n][n];d = new double[n];e = new double[n];issymmetric = true;for (int j = 0; (j < n) & issymmetric; j++) {for (int i = 0; (i < n) & issymmetric; i++) {issymmetric = (A[i][j] == A[j][i]);}}if (issymmetric) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {V[i][j] = A[i][j];}}// Tridiagonalize.tred2();// Diagonalize.tql2();} else {H = new double[n][n];ort = new double[n];for (int j = 0; j < n; j++) {for (int i = 0; i < n; i++) {H[i][j] = A[i][j];}}// Reduce to Hessenberg form.orthes();// Reduce Hessenberg to real Schur form.hqr2();}}/* ------------------------Public Methods* ------------------------ *//** Return the eigenvector matrix@return V*/public Matrix getV () {return new Matrix(V,n,n);}/** Return the real parts of the eigenvalues@return real(diag(D))*/public double[] getRealEigenvalues () {return d;}/** Return the imaginary parts of the eigenvalues@return imag(diag(D))*/public double[] getImagEigenvalues () {return e;}/** Return the block diagonal eigenvalue matrix@return D*/public Matrix getD () {Matrix X = new Matrix(n,n);double[][] D = X.getArray();for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {D[i][j] = 0.0;}D[i][i] = d[i];if (e[i] > 0) {D[i][i+1] = e[i];} else if (e[i] < 0) {D[i][i-1] = e[i];}}return X;}private static final long serialVersionUID = 1; }

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的java 矩阵计算 加减乘除 反转 分解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久精品99久久久久久2456 | 青青久视频 | 99久久99热这里只有精品 | 天天草天天爽 | 亚洲午夜久久久综合37日本 | 欧美精品网站 | 视频一区二区三区视频 | 狠狠色丁香婷婷综合最新地址 | 国产精品高清在线观看 | 91福利区一区二区三区 | 中文字幕电影网 | 色多多视频在线 | 国产视频日韩视频欧美视频 | 黄色av免费看 | 久久久久久久99精品免费观看 | 国产一区二区三区免费观看视频 | 久草免费在线视频观看 | 国产精品18videosex性欧美 | 亚洲电影久久 | 中文字幕色网站 | 日韩美av在线 | 美女黄频在线观看 | 99久久99久久精品国产片果冰 | 六月丁香婷婷网 | 国产视频精品免费 | 美女精品在线观看 | 91视频高清免费 | 粉嫩aⅴ一区二区三区 | 中文字幕免费国产精品 | 成人免费在线观看入口 | 超碰在线最新网址 | 探花视频在线版播放免费观看 | 欧美午夜视频在线 | 久久人人爽爽人人爽人人片av | 久艹视频在线免费观看 | 美女网站一区 | 免费观看丰满少妇做爰 | 麻豆视频观看 | 激情欧美一区二区三区 | 久久狠狠一本精品综合网 | 男女精品久久 | 久久69精品久久久久久久电影好 | 在线小视频你懂的 | 欧美日韩国产三级 | 国产资源在线免费观看 | 国产97视频 | 又爽又黄又刺激的视频 | 天天色天天综合 | 欧美91片 | 久久国产影视 | 黄色高清视频在线观看 | 国产流白浆高潮在线观看 | 国产黄大片 | 在线观看色视频 | 日韩极品视频在线观看 | 在线观看91久久久久久 | 丁香电影小说免费视频观看 | 亚洲成a人片77777潘金莲 | 97超碰.com| 91久久精品一区二区三区 | 91成人精品视频 | 在线免费观看羞羞视频 | 天天干天天做 | 综合天堂av久久久久久久 | 黄色片网站av | 奇米导航 | 欧美成人黄色 | 欧美性春潮 | 麻豆视频免费在线 | 欧美日本不卡视频 | 天天干中文字幕 | 国产精品久久一 | 久久久免费观看 | 色综合久久中文字幕综合网 | 欧洲av在线 | 91精品在线免费观看视频 | 一区二区三区在线免费观看 | 综合激情av | 狠狠干天天| www四虎影院 | 天天射天天干天天插 | 欧美成年人在线视频 | 国产专区日韩专区 | 深夜免费福利网站 | 91成人精品一区在线播放69 | 青青河边草免费直播 | 又爽又黄又无遮挡网站动态图 | 欧美国产精品一区二区 | 在线观看色视频 | 国产主播大尺度精品福利免费 | 99成人免费视频 | 亚洲国产日韩在线 | 国产999视频在线观看 | 黄a网站| 五月开心六月伊人色婷婷 | 国产亚洲视频系列 | 国产精品日韩高清 | 国产欧美日韩精品一区二区免费 | 亚洲成a人片77777kkkk1在线观看 | 成人福利av| 狠狠狠狠狠狠干 | 亚洲影院一区 | 五月天激情综合网 | 在线日本看片免费人成视久网 | 亚洲视频aaa | 人人澡超碰碰97碰碰碰软件 | 亚洲黄色在线播放 | 福利在线看片 | 成人影片在线免费观看 | 五月婷婷六月丁香在线观看 | 精品福利网| 久久九九免费 | 亚洲天堂自拍视频 | 久久成人综合 | 国产伦理一区二区 | 国产欧美日韩精品一区二区免费 | 97精品在线| 精品一区av | 一级片色播影院 | 狠狠干激情 | 五月婷婷天堂 | 在线成人免费电影 | 91亚洲精品在线 | 在线免费黄色av | 91在线影视| 亚洲一级国产 | 超碰在线观看av.com | 婷婷六月在线 | 久久综合色综合88 | 天天亚洲 | 欧美成人精品三级在线观看播放 | 五月天丁香综合 | 中文字幕影片免费在线观看 | 国产视频18 | 成人欧美一区二区三区在线观看 | 福利精品在线 | 九九久| 久热久草| 97热视频| 日韩在线观看第一页 | 色综合久久88色综合天天6 | 精品一区二区在线免费观看 | 久久精品99久久久久久2456 | 国产视频一 | 亚洲精品久久久久久久不卡四虎 | 国产精品久久久一区二区三区网站 | 一区av在线播放 | 在线观看国产91 | 日韩在线播放欧美字幕 | 亚洲精品国产精品国自产观看浪潮 | 狠狠干天天操 | 国产午夜精品久久久久久久久久 | 天天爱天天操天天爽 | 国产成人精品综合久久久 | 国产精品久久久久久av | 国产手机视频在线播放 | 狠狠操操 | 国产黄色片一级三级 | 天堂av免费在线 | 国产成人av免费在线观看 | 五月婷在线观看 | 亚洲成人黄色在线 | 成人av电影免费观看 | 综合影视 | 五月综合在线观看 | 国产91对白在线播 | 久久精品这里精品 | 亚洲影视九九影院在线观看 | 精品电影一区二区 | 免费看的黄色 | 91豆花在线观看 | 999一区二区三区 | 99久久久国产精品免费99 | 日韩高清在线观看 | 欧美精品九九99久久 | 成年人在线观看免费视频 | 99免费在线视频观看 | 国产精品网址在线观看 | 在线观看国产 | 波多野结衣精品在线 | 99欧美| 欧美伦理电影一区二区 | 99欧美| 国产人成免费视频 | av免费在线网 | 99精品在线观看 | 亚洲视频456 | 西西人体4444www高清视频 | 婷婷激情在线 | 国产精品免费观看国产网曝瓜 | 一区二区三区四区精品视频 | 99久久精品无免国产免费 | 免费福利视频网 | 久久精品日产第一区二区三区乱码 | 九七在线视频 | 久草免费在线观看 | 精品久久1 | 久草精品视频在线看网站免费 | 狠狠操狠狠干2017 | 精品久久久亚洲 | 日韩欧美高清免费 | 国产不卡在线观看视频 | 精品免费视频 | 国产精品免费视频观看 | 国产日韩欧美在线观看 | 中文一区二区三区在线观看 | 久久久久久久久久伊人 | 视频一区二区三区视频 | 日韩激情在线视频 | 日本久久久久久久久 | 免费观看国产精品视频 | 天天操夜夜干 | 亚洲一级性 | av网在线观看 | 黄色小视频在线观看免费 | 日韩激情久久 | 日韩一区精品 | 日韩精品最新在线观看 | 国产中文字幕在线播放 | 国产精品免费观看网站 | 欧美性极品xxxx娇小 | av福利在线播放 | 欧美日韩色婷婷 | 免费看片网站91 | 天天色天天操综合网 | 午夜视频播放 | 成人福利在线 | 久久久精品成人 | 欧美日韩有码 | 在线观看国产区 | 亚洲不卡123 | 久久理论电影 | 少妇bbw搡bbbb搡bbb | 在线免费观看国产 | 精品a在线 | 久久久久久久久免费 | 成人av资源| 亚洲成人av在线播放 | 久久精品这里热有精品 | 97综合网| 久久黄色免费视频 | 久久精品国产免费 | 激情在线五月天 | 久久精品美女视频网站 | 97国产在线播放 | 91丨精品丨蝌蚪丨白丝jk | 欧美日韩天堂 | 日韩精品影视 | 激情综合啪 | 综合久久五月天 | 美女网站免费福利视频 | 国产99久| 一级久久久 | av网址最新 | 黄色免费高清视频 | 亚洲国产精品激情在线观看 | 18做爰免费视频网站 | 激情综合亚洲 | 日产乱码一二三区别在线 | 免费成人黄色片 | 中文字幕一区二区三区在线观看 | 久久社区视频 | 激情五月五月婷婷 | 国产免费视频一区二区裸体 | 亚洲www天堂com | 国产偷国产偷亚洲清高 | 狠狠躁夜夜躁人人爽视频 | 天堂av免费在线 | 色欲综合视频天天天 | 午夜久久久久久久久久久 | 亚洲国产精品视频在线观看 | 久久免费高清 | 精品国产欧美 | www.黄色| 国产精品欧美久久久久三级 | 在线观看av中文字幕 | 男女激情免费网站 | 丁香国产视频 | 天天射天天干 | 免费v片 | 久久久久久久久久久久电影 | 欧美视频在线二区 | 免费看的黄色片 | 一区中文字幕 | 日韩av美女 | 少妇bbw撒尿| 99精品在线免费观看 | 欧美另类成人 | 国产精品久久久久永久免费 | a视频免费看 | 国产美女精彩久久 | 九色91视频 | 国产一级片一区二区三区 | 亚洲天堂网在线观看视频 | 91亚色免费视频 | 国产99一区 | 欧美午夜寂寞影院 | 精品国产_亚洲人成在线 | 亚洲 欧美 日韩 综合 | 视频在线观看日韩 | 日韩中文在线字幕 | 91av电影在线 | 99久久99久久精品 | 精品一区欧美 | 中文字幕麻豆 | 69av国产 | 国产精品一区二区三区99 | 在线免费观看涩涩 | 久久久久久国产精品免费 | 特及黄色片 | 国产一区不卡在线 | 国产精品久久久久久久久大全 | 三级av免费| 久久视奸 | 欧美综合久久久 | 一区二区三区三区在线 | 一区 二区电影免费在线观看 | 香蕉97视频观看在线观看 | 特级片免费看 | 日韩簧片在线观看 | 最近久乱中文字幕 | 97av视频在线观看 | 玖玖爱免费视频 | 国产精品久久久久久超碰 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 91九色视频网站 | www.狠狠| 麻豆视频网址 | 国产精品一区二区三区久久久 | 麻豆传媒视频在线 | 午夜久久福利视频 | 色综合久 | 欧美一区二区在线免费观看 | 天堂网一区| 日韩免费电影一区二区三区 | 国产日韩精品久久 | 欧美久久久久久久久中文字幕 | 成人欧美一区二区三区在线观看 | 99久久国产免费,99久久国产免费大片 | 日韩精品一区二区三区中文字幕 | 激情综合色综合久久综合 | 天天夜夜操 | 国产在线观看av | 免费看三级 | 色综合天天色综合 | 精品国产一区二区三区久久久 | 免费在线黄色av | 国产九九在线 | av在线播放不卡 | 国产精品专区h在线观看 | 天天色天天草天天射 | 国产69精品久久久久久 | 中文字幕在线视频精品 | 国产一级二级视频 | 成人一级片免费看 | 亚洲国产视频在线 | 涩涩资源网 | 久久综合99| 亚洲一区二区视频 | 国产精品久久久久久久久久了 | 午夜色站| 欧美日韩国产色综合一二三四 | www.天天干| 天天操天天干天天 | 天天爽夜夜爽人人爽一区二区 | 99亚洲精品 | 亚洲精品美女视频 | 国产探花视频在线播放 | 色播六月天 | 岛国av在线 | 国产亚洲精品久久19p | 在线99 | 91网免费观看 | 激情视频久久 | 久久国产品 | 欧美日韩18 | 中文在线字幕免费观 | 天堂网一区二区 | 日韩1级片 | 久久精品这里热有精品 | 国产成人三级在线 | 日韩在线观看不卡 | 国产精品日韩欧美 | 在线天堂视频 | 五月婷婷激情综合 | 97超碰人人澡人人爱学生 | 午夜av免费观看 | 中文字幕一区二区三区精华液 | av免费看在线 | 91人网站 | 免费在线日韩 | 国产成人精品久久久久 | 欧美午夜精品久久久久久孕妇 | 狠狠色丁香 | 免费国产在线观看 | 国产精品99久久久久的智能播放 | 精品国产精品一区二区夜夜嗨 | 一区二区男女 | 中文字幕在线一区二区三区 | 一级黄色电影网站 | 国产精品成人一区二区三区吃奶 | 久久久久久中文字幕 | 西西4444www大胆艺术 | 国产99re| 91九色综合 | 久久精品视 | 亚洲黄色在线播放 | www.国产毛片| 中文字幕资源网 | 成人影视片| 在线观看av黄色 | 天天干夜夜爱 | 一色av| 91麻豆看国产在线紧急地址 | 国内成人综合 | 久久国产欧美日韩精品 | 免费在线观看午夜视频 | 日韩亚洲在线视频 | 超碰日韩 | 久久伦理视频 | www.干| www黄色com | 国产精品人人做人人爽人人添 | 亚洲第一区精品 | 亚洲特级毛片 | www91在线观看 | 色综合小说 | 欧美性色黄大片在线观看 | 99热在线精品观看 | 在线看成人 | 亚洲精品午夜视频 | 中中文字幕av在线 | 中文在线 | 国产精品乱码久久久久久1区2区 | 久草精品视频在线看网站免费 | 干干夜夜 | 色婷婷成人 | 麻豆传媒在线免费看 | 亚洲欧洲精品视频 | 日韩免费三区 | 91精选在线 | 不卡视频在线 | 亚洲国产三级在线 | 国产无限资源在线观看 | 在线观看亚洲电影 | 色婷婷福利视频 | 黄色大片免费播放 | 日韩国产欧美在线播放 | 三级av片| 午夜美女福利 | 久久av观看 | 欧洲一区二区在线观看 | 欧美一级黄色视屏 | 久久草网站 | 日韩精品在线一区 | 国产日产欧美在线观看 | 亚洲最新在线视频 | www.久久视频| 成人一级电影在线观看 | 日产乱码一二三区别免费 | 日日夜夜人人精品 | 欧美激情综合五月色丁香小说 | 久久精品99国产国产 | 91在线看免费 | 99精品国产亚洲 | 91精品久久久久久综合五月天 | 一级黄色大片 | 中文字幕欧美日韩va免费视频 | 久久婷婷五月综合色丁香 | 亚洲视频1 | 成人黄大片视频在线观看 | 在线视频欧美精品 | 在线观看深夜视频 | 成人av在线网 | 久久黄色网址 | 一区二区三区手机在线观看 | 国产日产欧美在线观看 | 在线影院 国内精品 | 亚洲乱码久久 | 日韩av午夜在线观看 | 91免费看片黄 | 91久久久久久国产精品 | 久久免费国产 | 久草在线 | 91精品亚洲影视在线观看 | 久久免费精品一区二区三区 | 色天堂在线视频 | 最近中文字幕免费av | 五月婷婷在线视频观看 | 久久av中文字幕片 | 中文电影网 | 五月天婷婷在线播放 | 亚洲午夜精品一区二区三区电影院 | 成人久久18免费网站 | 国产精品无av码在线观看 | 亚洲国产一二三 | 成人小视频在线播放 | 国产不卡网站 | 日韩中文在线视频 | 成人wwwxxx视频 | 久久另类小说 | 色综合久久网 | 亚洲va在线va天堂va偷拍 | 黄色性av| 亚洲aⅴ一区二区三区 | 精品一区中文字幕 | 色网站在线 | 国产欧美在线一区 | 亚洲精品午夜一区人人爽 | 337p日本欧洲亚洲大胆裸体艺术 | 精品1区二区 | 亚洲一区二区三区毛片 | 欧美视频二区 | 一级片免费视频 | 99国产在线视频 | 色婷婷综合久久久久 | 91久久久久久久一区二区 | 高潮久久久 | 午夜国产福利在线观看 | 免费在线黄 | 国产手机精品视频 | 三级黄色片在线观看 | 国产精品自产拍在线观看蜜 | 国产日本在线 | 永久免费的啪啪网站免费观看浪潮 | 国产精品av免费 | 在线三级播放 | 久久激情综合 | 日韩高清精品一区二区 | se视频网址 | 婷婷色视频 | 日韩精品一区二区三区中文字幕 | 日韩高清在线一区 | 久久观看| 伊人小视频| 久热免费 | 天天干,狠狠干 | 最新真实国产在线视频 | 亚洲国产成人精品在线观看 | 国产在线视频一区二区 | 正在播放国产精品 | 亚洲黄色成人av | 九九热在线播放 | 日韩欧美在线综合网 | 99免费在线观看视频 | 久久精品电影院 | 国产精品久久久久久久久大全 | 亚洲一区二区高潮无套美女 | 91精品一区二区在线观看 | 一区二区三区在线免费观看 | 色综合久久中文字幕综合网 | 成人网页在线免费观看 | 人人射人人爽 | 欧美日韩91 | 日韩黄色软件 | 中文字幕av在线免费 | 欧美日韩在线播放 | 色一色在线 | 欧美激情综合五月 | 欧美在线a视频 | 亚洲综合激情 | 久久99在线观看 | 国产成人91 | 欧美日韩国产一二 | 成人a大片| 日韩电影中文,亚洲精品乱码 | av中文字幕在线播放 | 欧美大jb | 久要激情网 | 久久久精品网 | 日韩欧美视频免费观看 | www欧美日韩 | 丁香花在线视频观看免费 | 久久精品日韩 | 国产精品久久久久久久久久99 | 一区二三国产 | 成人a毛片 | 夜添久久精品亚洲国产精品 | 粉嫩av一区二区三区四区在线观看 | 日韩最新在线视频 | 天天干国产 | 超级碰99| 国产成人精品一二三区 | 一区二区中文字幕在线播放 | 亚洲精品国久久99热 | 中文字幕亚洲高清 | 香蕉网在线 | 欧美精品一区二区免费 | 中文字幕在线观看视频一区 | 日本一区二区高清不卡 | 91av网址| 午夜 免费 | 狠狠狠狠狠狠操 | 欧美一区二区三区在线视频观看 | www.黄色片网站 | 91网站在线视频 | 日韩在线免费小视频 | 午夜久久影视 | 国产精品高潮呻吟久久久久 | 免费韩国av | 九九视频精品在线 | 精品一区 精品二区 | 热热热热热色 | av黄色国产 | 日韩免费一区二区在线观看 | 日韩高清在线一区二区三区 | 亚洲黄色小说网 | 亚洲日本va在线观看 | 激情综合狠狠 | 国产视频在线观看一区二区 | 午夜视频在线观看一区二区 | 中国一级片在线 | 成人cosplay福利网站 | 91c网站色版视频 | 免费高清在线一区 | 色资源网免费观看视频 | 美女搞黄国产视频网站 | 国产白浆视频 | 亚洲国内精品在线 | 日本精品二区 | 激情久久综合网 | 91精品久久久久久久久久久久久 | 久久国产精品免费一区 | 欧美成人xxxxxxxx | 亚洲精品午夜aaa久久久 | 一区二区电影网 | 日韩深夜在线观看 | 久久久精品国产一区二区三区 | 激情五月在线观看 | 涩涩网站在线播放 | a级片韩国 | 欧美乱码精品一区二区 | 免费一区在线 | 97夜夜澡人人双人人人喊 | 天堂av网在线 | 91丨九色丨国产女 | 天天曰夜夜操 | 亚洲精品黄色片 | 夜夜澡人模人人添人人看 | 蜜臀aⅴ国产精品久久久国产 | 一二区电影 | 视频一区亚洲 | 免费97视频 | 五月婷婷中文网 | 天天天天爱天天躁 | 国产色妞影院wwwxxx | 免费99| 99高清视频有精品视频 | 97视频网址 | 丝袜美腿在线 | 亚洲精区二区三区四区麻豆 | 黄色毛片一级 | 丁香六月网 | 五月婷婷综合色拍 | 91天堂素人约啪 | 香蕉免费在线 | 99精品在线免费在线观看 | 国产aa精品 | 国产中文字幕视频 | 国产精品久久久久999 | 国产剧在线观看片 | 91中文视频 | 亚洲永久精品一区 | 在线观看av免费 | 丁香婷婷网| 色婷婷一 | 99精品视频在线观看播放 | 久久99久久99精品 | 婷婷综合视频 | 国产色视频| 亚洲综合在线视频 | 久久尤物电影视频在线观看 | 一级国产视频 | 欧美在线日韩在线 | 岛国大片免费视频 | www天天操 | 中文字幕日韩电影 | 久久免费在线观看 | 91污在线| 人人澡人人添人人爽一区二区 | 国产丝袜高跟 | 国产一区福利在线 | 欧美少妇18p | 日韩精品在线免费播放 | 久久国产精品精品国产色婷婷 | 在线观看精品国产 | 99视频在线精品国自产拍免费观看 | 日韩视频一 | 国产精品精品国产色婷婷 | 在线视频 成人 | 亚洲人精品午夜 | 日韩理论电影在线观看 | 婷婷色社区 | 日韩中文字幕在线观看 | 99久久影视 | 久久99精品国产麻豆婷婷 | 天天干天天射天天插 | 国产69久久久 | 久久久精品成人 | 午夜av免费| 色综合激情久久 | 国产精品毛片一区二区在线 | 999超碰| 日日夜夜综合网 | 亚洲精品在线观看av | 亚洲男女精品 | 麻豆国产视频 | 国产精品美女久久久久久 | 在线观看免费高清视频大全追剧 | 92国产精品久久久久首页 | 狠狠色狠狠色 | 99re8这里有精品热视频免费 | av在线之家电影网站 | 国产亚洲一区 | 色久五月| 国产a级免费 | 特级a毛片 | 欧美精品久久久久久久亚洲调教 | 欧美与欧洲交xxxx免费观看 | www.久久色.com| 在线免费观看黄 | 国产成人一区二区三区影院在线 | 成人三级网站在线观看 | 国产午夜视频在线观看 | 女人18毛片a级毛片一区二区 | 一区二区视频在线播放 | 久久精品国产免费看久久精品 | 国产日产欧美在线观看 | 96看片| 久久一久久 | 欧美夫妻性生活电影 | 五月婷婷综合激情 | 偷拍区另类综合在线 | 天天草天天摸 | 激情视频网页 | 国内精品久久久久影院优 | 亚洲夜夜综合 | 综合影视| 欧美精品一二三 | 91精品在线视频观看 | 久久免费电影网 | 一区二区三区中文字幕在线观看 | 亚洲国产日韩一区 | 探花国产在线 | 欧美精品一区二区性色 | 久久国产福利 | 国内免费的中文字幕 | 综合精品在线 | 中文字幕 在线看 | 操操操干干干 | 国产精品成人久久久久 | 精品 激情 | 91手机电视 | www.夜色.com | 日韩成人免费观看 | 亚洲视频免费在线观看 | 亚洲欧美在线综合 | 丁香六月综合网 | 操操操天天操 | 国产成人在线免费观看 | 中文字幕在线观看完整版电影 | 一级片观看| 久久观看 | 亚洲国产精品成人av | 久久精品久久99 | 亚洲精品一区二区精华 | 亚洲激情av | 人人射人人爱 | 久久久久国产成人精品亚洲午夜 | 五月天婷婷在线播放 | www.国产高清 | 超碰免费公开 | 最近高清中文在线字幕在线观看 | 久久国产精品免费观看 | 婷婷激情欧美 | 欧美激情综合五月色丁香 | 999久久久久久久久久久 | 欧美一区二区三区激情视频 | 国产精品人成电影在线观看 | 91综合久久一区二区 | av永久网址| 亚洲激情视频在线观看 | 精品欧美在线视频 | 日韩视频在线不卡 | 色网站在线观看 | 日韩在线观看你懂得 | 欧美日韩中文在线 | 国产精品视频专区 | 欧美久久久 | 亚洲区精品视频 | 欧洲激情综合 | 精品uu | 欧美性色19p| 久久精品久久国产 | 97免费| 精品在线观看一区二区三区 | 在线观看免费一级片 | 91精品推荐| 国产精品麻豆视频 | 人人狠狠综合久久亚洲婷 | 国产精品视频线看 | 欧美另类网站 | 7777精品伊人久久久大香线蕉 | www.天天干.com | 成人免费在线观看电影 | 久久久精品国产一区二区三区 | 国产三级在线播放 | 欧美一区二区视频97 | 亚洲精品国精品久久99热一 | 91在线在线观看 | 黄色国产在线 | 成人a v视频 | 在线成人中文字幕 | 久热超碰| 国产va饥渴难耐女保洁员在线观看 | 国产精品一区在线观看你懂的 | 久久在线免费 | 美女黄频视频大全 | 一级免费观看 | 一区二区三区免费看 | 中文字幕日本在线观看 | 五月婷婷激情综合网 | 五月天婷婷综合 | 国产精品对白一区二区三区 | 亚洲欧美在线视频免费 | 中文字幕中文字幕 | 激情五月婷婷综合网 | 欧美精品二区 | 操综合| 91色亚洲 | 欧洲一区精品 | 免费一级黄色 | 亚洲成人动漫在线观看 | 国产精品久久久久久久久久久免费 | 久久久久久久久久久久电影 | 国产精品手机播放 | 成年人在线免费视频观看 | 免费国产一区二区视频 | 99中文字幕视频 | 免费网址在线播放 | 久久综合国产伦精品免费 | 日韩av一区二区在线播放 | 国产伦精品一区二区三区高清 | 婷婷伊人五月 | 安徽妇搡bbbb搡bbbb | 国内精品视频在线播放 | 又黄又刺激又爽的视频 | 国产午夜三级 | 久热爱 | 碰超在线观看 | 人人看人人爱 | 午夜精品婷婷 | 黄色美女免费网站 | 久久精品一二三 | 欧美美女视频在线观看 | 激情五月激情综合网 | 亚洲高清91 | 天天色天天操综合网 | 91在线色| 免费福利视频网站 | 亚洲国产免费看 | 日韩免费在线观看视频 | 最近更新好看的中文字幕 | 2024国产精品视频 | 国产成人一区二区三区久久精品 | 在线你懂 | 粉嫩av一区二区三区四区五区 | 奇米网在线观看 | 一区二区三区在线播放 | 国产精品国产三级国产不产一地 | 亚洲在线精品视频 | 天天操天天射天天爽 | 天天操天天干天天操天天干 | 91精品啪啪 | 在线日韩 | 亚洲九九影院 | 国产精品 999| 天天操天天色综合 | 在线观看免费av片 | 久久精品国产免费观看 | 日韩在线字幕 | 干天天 | 黄色av一区二区三区 | 日韩精品一区二区三区外面 | 91香蕉视频污在线 | 性色va| 国产精品久久久久久久久久久久午夜 | 涩涩伊人 | 亚州日韩中文字幕 | 亚洲综合小说电影qvod | 国产免费黄色 | 国产黄视频在线观看 | 久久综合九色综合97婷婷女人 | av福利超碰网站 | 国产精品 中文在线 | 成年人免费观看国产 | 91精品啪在线观看国产线免费 | 日韩精品首页 | 国产成人av网站 | 在线观看久久久久久 | 久久av免费电影 | 深爱激情综合网 | 在线视频日韩一区 | 国产色视频一区 | 久久一精品 | 国产黄色一级大片 | 丰满少妇在线 | 久久天天躁狠狠躁夜夜不卡公司 | 91av在线播放视频 | 麻豆va一区二区三区久久浪 | 国产99一区二区 | 中文字幕在线中文 | 搡bbbb搡bbb视频 | 久久精品国产亚洲精品2020 | 精品久久久久免费极品大片 | 国产成人99久久亚洲综合精品 | 国产高清不卡一区二区三区 | 狠狠躁夜夜av | 日韩av片免费在线观看 | 日韩免费播放 | 这里有精品在线视频 | 高清国产在线一区 | 永久免费毛片在线观看 | 亚洲国内精品视频 | 日韩 精品 一区 国产 麻豆 | 好看av在线 | 狠狠躁夜夜躁人人爽超碰91 | 81国产精品久久久久久久久久 | 干天天| av片中文字幕| 在线中文视频 | 国产99一区视频免费 | 色婷婷在线观看视频 | 在线观看精品视频 | 久久精品一二三 | 久久免费久久 | 欧美激情精品久久久久久免费印度 | 国产成人精品久久亚洲高清不卡 | 国产精品第二页 | av一区二区三区在线 | av在线8 | 婷婷国产视频 | 国产日本在线观看 | 国产精品色视频 | 超碰97人人干 | 在线精品视频在线观看高清 | 国产免费观看av | 午夜少妇av| 国产成人精品福利 | 成人四虎影院 | 天天爽天天射 | 激情欧美丁香 | 中文在线免费一区三区 | av日韩精品 | 在线综合色 | 国产视频 亚洲视频 | 国产xx在线 | 91av播放 | 天天综合成人网 | 国产美女精品久久久 | 免费在线观看午夜视频 | 日韩精品一区二区三区视频播放 | 麻花豆传媒mv在线观看 | 狠狠色丁香婷婷综合欧美 | 国产美女网站在线观看 | 亚洲精品久久久久久中文传媒 | 成人久久久久久久久久 | 国产成人av免费在线观看 | 99免费观看视频 | 久久www免费视频 | 国产一区二区在线免费视频 | 91丨九色丨蝌蚪丨老版 | 黄色大片日本免费大片 | 一区二区三区精品久久久 | 国产亚洲婷婷免费 | 99热九九这里只有精品10 | 四虎影视www | 亚洲视频每日更新 | 中文字幕国产亚洲 | 精品国产乱码一区二区三区在线 | 狠狠操电影网 | 日韩精品免费在线观看视频 | 午夜美女wwww | 69视频国产 | 日日夜夜精品网站 | 国产精品久久久久久久久费观看 | 国产成人专区 | 久久精品视频中文字幕 | av在线之家电影网站 | 国产黑丝一区二区 | 国产精品一区二区久久久 | 国产伦精品一区二区三区无广告 | 黄www在线观看 | 亚洲国产成人在线播放 | 国产亚洲综合性久久久影院 | 日日日视频| 久久久久久亚洲精品 | 免费亚洲片 |