public static bool isIdentical(DMatrix6 a, DMatrix6 b, double tol) { if (!MatrixFeatures_DDRM.isIdentical(a.a1, b.a1, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a2, b.a2, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a3, b.a3, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a4, b.a4, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a5, b.a5, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a6, b.a6, tol)) { return(false); } return(true); }
public virtual bool decompose(DMatrixRMaj orig) { A.set(orig); symmetric = MatrixFeatures_DDRM.isSymmetric(A, tol); return(symmetric ? symmetricAlg.decompose(A) : generalAlg.decompose(A)); }
public static bool isEquals(DMatrixRBlock A, DMatrixRBlock B, double tol) { if (A.blockLength != B.blockLength) { return(false); } return(MatrixFeatures_DDRM.isEquals(A, B, tol)); }
/** * <p> * If a vector then a square matrix is returned if a matrix then a vector of diagonal ements is returned * </p> * * @see CommonOps_DDRM#extractDiag(DMatrixRMaj, DMatrixRMaj) * @return Diagonal elements inside a vector or a square matrix with the same diagonal elements. */ public T diag <T>() where T : SimpleMatrix <W> { T diag; if (bits() == 64) { if (MatrixFeatures_DDRM.isVector(mat)) { int N = Math.Max(mat.NumCols, mat.NumRows); diag = (T)createMatrix(N, N, mat.Type); CommonOps_DDRM.diag((DMatrixRMaj)diag.mat, N, ((DMatrixRMaj)mat).data); } else { int N = Math.Min(mat.NumCols, mat.NumRows); diag = (T)createMatrix(N, 1, mat.Type); CommonOps_DDRM.extractDiag((DMatrixRMaj)mat, (DMatrixRMaj)diag.mat); } } else { if (MatrixFeatures_DDRM.isVector(mat)) { int N = Math.Max(mat.NumCols, mat.NumRows); diag = (T)createMatrix(N, N, mat.Type); CommonOps_DDRM.diag((DMatrixRMaj)diag.mat, N, ((DMatrixRMaj)mat).data); } else { int N = Math.Min(mat.NumCols, mat.NumRows); diag = (T)createMatrix(N, 1, mat.Type); CommonOps_DDRM.extractDiag((DMatrixRMaj)mat, (DMatrixRMaj)diag.mat); } //if (MatrixFeatures_FDRM.isVector(mat)) //{ // int N = Math.Max(mat.NumCols, mat.NumRows); // diag = createMatrix(N, N, mat.Type); // CommonOps_FDRM.diag((FMatrixRMaj)diag.mat, N, ((FMatrixRMaj)mat).data); //} //else //{ // int N = Math.min(mat.NumCols, mat.NumRows); // diag = createMatrix(N, 1, mat.Type); // CommonOps_FDRM.extractDiag((FMatrixRMaj)mat, (FMatrixRMaj)diag.mat); //} } return(diag); }
public void performImplicitSingleStep(int x1, int x2, double eigenvalue) { if (!createBulgeSingleStep(x1, eigenvalue)) { return; } // get rid of the bump if (Q != null) { QrHelperFunctions_DDRM.rank1UpdateMultR(Q, u.data, gamma, 0, x1, x1 + 2, _temp.data); if (checkOrthogonal && !MatrixFeatures_DDRM.isOrthogonal(Q, UtilEjml.TEST_F64)) { throw new InvalidOperationException("Bad"); } } if (printHumps) { Console.WriteLine("Applied first Q matrix, it should be humped now. A = "); A.print("%12.3e"); Console.WriteLine("Pushing the hump off the matrix."); } // perform simple steps for (int i = x1; i < x2 - 1; i++) { if (bulgeSingleStepQn(i) && Q != null) { QrHelperFunctions_DDRM.rank1UpdateMultR(Q, u.data, gamma, 0, i + 1, i + 3, _temp.data); if (checkOrthogonal && !MatrixFeatures_DDRM.isOrthogonal(Q, UtilEjml.TESTP_F64)) { throw new InvalidOperationException("Bad"); } } if (printHumps) { Console.WriteLine("i = " + i + " A = "); A.print("%12.3e"); } } if (checkHessenberg && !MatrixFeatures_DDRM.isUpperTriangle(A, 1, UtilEjml.TESTP_F64)) { A.print("%12.3e"); throw new InvalidOperationException("Bad matrix"); } }
private void checkMatrix(int numRows, int numCols) { DMatrixRMaj A = RandomMatrices_DDRM.rectangle(numRows, numCols, -1, 1, rand); QRExampleOperations alg = new QRExampleOperations(); alg.decompose(A); DMatrixRMaj Q = alg.getQ(); DMatrixRMaj R = alg.getR(); DMatrixRMaj A_found = new DMatrixRMaj(numRows, numCols); CommonOps_DDRM.mult(Q, R, A_found); Assert.IsTrue(MatrixFeatures_DDRM.isIdentical(A, A_found, UtilEjml.TEST_F64)); }
public static bool isIdentical(DMatrix2x2 a, DMatrix2x2 b, double tol) { if (!MatrixFeatures_DDRM.isIdentical(a.a11, b.a11, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a12, b.a12, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a21, b.a21, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a22, b.a22, tol)) { return(false); } return(true); }
/// <summary> /// If a vector then a square matrix is returned if a matrix then a vector of diagonal ements is returned. /// </summary> /// <returns>Diagonal elements inside a vector or a square matrix with the same diagonal elements.</returns> /// <see cref="CommonOps_DDRM.extractDiag(DMatrixRMaj, DMatrixRMaj)"/> public SimpleMatrixD diag() { SimpleMatrixD diag; if (MatrixFeatures_DDRM.isVector(mat)) { int N = Math.Max(mat.getNumCols(), mat.getNumRows()); diag = createMatrix(N, N); var dm = diag.getMatrix(); CommonOps_DDRM.diag(dm, N, mat.data); } else { int N = Math.Min(mat.getNumCols(), mat.getNumRows()); diag = createMatrix(N, 1); var dm = diag.getMatrix(); CommonOps_DDRM.extractDiag(mat, dm); } return(diag); }
/// <summary> /// Checks to see if matrix 'a' is the same as this matrix within the specified tolerance. /// </summary> public override bool isIdentical(SimpleMatrixD a, double tol) { var am = a.getMatrix(); return(MatrixFeatures_DDRM.isIdentical(mat, am, tol)); }
public static bool isIdentical(DMatrix4x4 a, DMatrix4x4 b, double tol) { if (!MatrixFeatures_DDRM.isIdentical(a.a11, b.a11, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a12, b.a12, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a13, b.a13, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a14, b.a14, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a21, b.a21, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a22, b.a22, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a23, b.a23, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a24, b.a24, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a31, b.a31, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a32, b.a32, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a33, b.a33, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a34, b.a34, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a41, b.a41, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a42, b.a42, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a43, b.a43, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a44, b.a44, tol)) { return(false); } return(true); }
public static bool isIdentical(DMatrix6x6 a, DMatrix6x6 b, double tol) { if (!MatrixFeatures_DDRM.isIdentical(a.a11, b.a11, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a12, b.a12, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a13, b.a13, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a14, b.a14, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a15, b.a15, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a16, b.a16, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a21, b.a21, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a22, b.a22, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a23, b.a23, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a24, b.a24, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a25, b.a25, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a26, b.a26, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a31, b.a31, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a32, b.a32, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a33, b.a33, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a34, b.a34, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a35, b.a35, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a36, b.a36, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a41, b.a41, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a42, b.a42, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a43, b.a43, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a44, b.a44, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a45, b.a45, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a46, b.a46, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a51, b.a51, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a52, b.a52, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a53, b.a53, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a54, b.a54, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a55, b.a55, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a56, b.a56, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a61, b.a61, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a62, b.a62, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a63, b.a63, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a64, b.a64, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a65, b.a65, tol)) { return(false); } if (!MatrixFeatures_DDRM.isIdentical(a.a66, b.a66, tol)) { return(false); } return(true); }
public bool bulgeSingleStepQn(int i, double a11, double a21, double threshold, bool set) { double max; if (normalize) { max = Math.Abs(a11); if (max < Math.Abs(a21)) { max = Math.Abs(a21); } // if( max <= Math.Abs(A.get(i,i))*UtilEjml.EPS ) { if (max <= threshold) { // Console.WriteLine("i = "+i); // A.print(); if (set) { A.set(i, i - 1, 0); A.set(i + 1, i - 1, 0); } return(false); } a11 /= max; a21 /= max; } else { max = 1; } // compute the reflector using the b's above double tau = Math.Sqrt(a11 * a11 + a21 * a21); if (a11 < 0) { tau = -tau; } double div = a11 + tau; u.set(i, 0, 1); u.set(i + 1, 0, a21 / div); gamma = div / tau; // compute A_1 = Q_1^T * A * Q_1 // apply Q*A - just do the 3 rows QrHelperFunctions_DDRM.rank1UpdateMultR(A, u.data, gamma, 0, i, i + 2, _temp.data); if (set) { A.set(i, i - 1, -max * tau); A.set(i + 1, i - 1, 0); } // apply A*Q - just the three things QrHelperFunctions_DDRM.rank1UpdateMultL(A, u.data, gamma, 0, i, i + 2); if (checkUncountable && MatrixFeatures_DDRM.hasUncountable(A)) { throw new InvalidOperationException("bad matrix"); } return(true); }
private void performImplicitDoubleStep(int x1, int x2, double b11, double b21, double b31) { if (!bulgeDoubleStepQn(x1, b11, b21, b31, 0, false)) { return; } // get rid of the bump if (Q != null) { QrHelperFunctions_DDRM.rank1UpdateMultR(Q, u.data, gamma, 0, x1, x1 + 3, _temp.data); if (checkOrthogonal && !MatrixFeatures_DDRM.isOrthogonal(Q, UtilEjml.TEST_F64)) { u.print(); Q.print(); throw new InvalidOperationException("Bad"); } } if (printHumps) { Console.WriteLine("Applied first Q matrix, it should be humped now. A = "); A.print("%12.3e"); Console.WriteLine("Pushing the hump off the matrix."); } // perform double steps for (int i = x1; i < x2 - 2; i++) { if (bulgeDoubleStepQn(i) && Q != null) { QrHelperFunctions_DDRM.rank1UpdateMultR(Q, u.data, gamma, 0, i + 1, i + 4, _temp.data); if (checkOrthogonal && !MatrixFeatures_DDRM.isOrthogonal(Q, UtilEjml.TEST_F64)) { throw new InvalidOperationException("Bad"); } } if (printHumps) { Console.WriteLine("i = " + i + " A = "); A.print("%12.3e"); } } if (printHumps) { Console.WriteLine("removing last bump"); } // the last one has to be a single step if (x2 - 2 >= 0 && bulgeSingleStepQn(x2 - 2) && Q != null) { QrHelperFunctions_DDRM.rank1UpdateMultR(Q, u.data, gamma, 0, x2 - 1, x2 + 1, _temp.data); if (checkOrthogonal && !MatrixFeatures_DDRM.isOrthogonal(Q, UtilEjml.TEST_F64)) { throw new InvalidOperationException("Bad"); } } if (printHumps) { Console.WriteLine(" A = "); A.print("%12.3e"); } // A.print("%12.3e"); if (checkHessenberg && !MatrixFeatures_DDRM.isUpperTriangle(A, 1, UtilEjml.TEST_F64)) { A.print("%12.3e"); throw new InvalidOperationException("Bad matrix"); } }