/** * Creates a new random symmetric matrix that will have the specified real eigenvalues. * * @param num Dimension of the resulting matrix. * @param rand Random number generator. * @param eigenvalues Set of real eigenvalues that the matrix will have. * @return A random matrix with the specified eigenvalues. */ public static DMatrixRMaj symmetricWithEigenvalues(int num, IMersenneTwister rand, double[] eigenvalues) { DMatrixRMaj V = RandomMatrices_DDRM.orthogonal(num, num, rand); DMatrixRMaj D = CommonOps_DDRM.diag(eigenvalues); DMatrixRMaj temp = new DMatrixRMaj(num, num); CommonOps_DDRM.mult(V, D, temp); CommonOps_DDRM.multTransB(temp, V, D); return(D); }
/** * <p> * Creates a random matrix which will have the provided singular values. The length of sv * is assumed to be the rank of the matrix. This can be useful for testing purposes when one * needs to ensure that a matrix is not singular but randomly generated. * </p> * * @param numRows Number of rows in generated matrix. * @param numCols NUmber of columns in generated matrix. * @param rand Random number generator. * @param sv Singular values of the matrix. * @return A new matrix with the specified singular values. */ public static DMatrixRMaj singleValues(int numRows, int numCols, IMersenneTwister rand, double[] sv) { DMatrixRMaj U = RandomMatrices_DDRM.orthogonal(numRows, numRows, rand); DMatrixRMaj V = RandomMatrices_DDRM.orthogonal(numCols, numCols, rand); DMatrixRMaj S = new DMatrixRMaj(numRows, numCols); int min = Math.Min(numRows, numCols); min = Math.Min(min, sv.Length); for (int i = 0; i < min; i++) { S.set(i, i, sv[i]); } DMatrixRMaj tmp = new DMatrixRMaj(numRows, numCols); CommonOps_DDRM.mult(U, S, tmp); CommonOps_DDRM.multTransB(tmp, V, S); return(S); }