示例#1
0
        public static bool lower4(DMatrix1Row A, DMatrix1Row L)
        {
            double[] data = A.data;

            double a11 = data[0];
            double a21 = data[4];
            double a22 = data[5];
            double a31 = data[8];
            double a32 = data[9];
            double a33 = data[10];
            double a41 = data[12];
            double a42 = data[13];
            double a43 = data[14];
            double a44 = data[15];

            L.data[0]  = a11 = Math.Sqrt(a11);
            L.data[1]  = 0;
            L.data[2]  = 0;
            L.data[3]  = 0;
            L.data[4]  = a21 = (a21) / a11;
            L.data[5]  = a22 = Math.Sqrt(a22 - a21 * a21);
            L.data[6]  = 0;
            L.data[7]  = 0;
            L.data[8]  = a31 = (a31) / a11;
            L.data[9]  = a32 = (a32 - a31 * a21) / a22;
            L.data[10] = a33 = Math.Sqrt(a33 - a31 * a31 - a32 * a32);
            L.data[11] = 0;
            L.data[12] = a41 = (a41) / a11;
            L.data[13] = a42 = (a42 - a41 * a21) / a22;
            L.data[14] = a43 = (a43 - a41 * a31 - a42 * a32) / a33;
            L.data[15] = Math.Sqrt(a44 - a41 * a41 - a42 * a42 - a43 * a43);
            return(!UtilEjml.isUncountable(L.data[15]));
        }
示例#2
0
        /**
         * Converts DMatrixSparseTriplet into a DMatrixSparseCSC. Duplicate elements in triplet will result in an
         * illegal matrix in output having duplicate elements.
         *
         * @param src Original matrix which is to be copied.  Not modified.
         * @param dst Destination. Will be a copy.  Modified.
         * @param histStorage Workspace. Can be null.
         */
        public static DMatrixSparseCSC convert(DMatrixSparseTriplet src, DMatrixSparseCSC dst,
                                               IGrowArray histStorage)
        {
            dst = UtilEjml.reshapeOrDeclare(dst, src.numRows, src.numCols, src.nz_length);

            int[] hist = UtilEjml.adjustClear(histStorage, src.numCols);

            // compute the number of elements in each columns
            for (int i = 0; i < src.nz_length; i++)
            {
                hist[src.nz_rowcol.data[i * 2 + 1]]++;
            }

            // define col_idx
            dst.histogramToStructure(hist);
            System.Array.Copy(dst.col_idx, 0, hist, 0, dst.numCols);

            // now write the row indexes and the values
            for (int i = 0; i < src.nz_length; i++)
            {
                int    row   = src.nz_rowcol.data[i * 2];
                int    col   = src.nz_rowcol.data[i * 2 + 1];
                double value = src.nz_value.data[i];

                int index = hist[col]++;
                dst.nz_rows[index]   = row;
                dst.nz_values[index] = value;
            }
            dst.indicesSorted = false;

            return(dst);
        }
示例#3
0
        public static bool upper4(DMatrix1Row A, DMatrix1Row R)
        {
            double[] data = A.data;

            double a11 = data[0];
            double a12 = data[1];
            double a22 = data[5];
            double a13 = data[2];
            double a23 = data[6];
            double a33 = data[10];
            double a14 = data[3];
            double a24 = data[7];
            double a34 = data[11];
            double a44 = data[15];

            R.data[0]  = a11 = Math.Sqrt(a11);
            R.data[4]  = 0;
            R.data[8]  = 0;
            R.data[12] = 0;
            R.data[1]  = a12 = (a12) / a11;
            R.data[5]  = a22 = Math.Sqrt(a22 - a12 * a12);
            R.data[9]  = 0;
            R.data[13] = 0;
            R.data[2]  = a13 = (a13) / a11;
            R.data[6]  = a23 = (a23 - a12 * a13) / a22;
            R.data[10] = a33 = Math.Sqrt(a33 - a13 * a13 - a23 * a23);
            R.data[14] = 0;
            R.data[3]  = a14 = (a14) / a11;
            R.data[7]  = a24 = (a24 - a12 * a14) / a22;
            R.data[11] = a34 = (a34 - a13 * a14 - a23 * a24) / a33;
            R.data[15] = Math.Sqrt(a44 - a14 * a14 - a24 * a24 - a34 * a34);
            return(!UtilEjml.isUncountable(R.data[15]));
        }
        //CONCURRENT_OMIT_END

        /**
         * @see CommonOps_DDRM#multTransB(double, org.ejml.data.DMatrix1Row, org.ejml.data.DMatrix1Row, org.ejml.data.DMatrix1Row)
         */
        public static void multTransB(double alpha, DMatrix1Row A, DMatrix1Row B, DMatrix1Row C)
        {
            UtilEjml.assertTrue(A != C && B != C, "Neither 'A' or 'B' can be the same matrix as 'C'");
            UtilEjml.assertShape(A.numCols, B.numCols, "The 'A' and 'B' matrices do not have compatible dimensions");
            C.reshape(A.numRows, B.numRows);

            //CONCURRENT_BELOW EjmlConcurrency.loopFor(0, A.numRows, xA -> {
            for (int xA = 0; xA < A.numRows; xA++)
            {
                int cIndex      = xA * B.numRows;
                int aIndexStart = xA * B.numCols;
                int end         = aIndexStart + B.numCols;
                int indexB      = 0;
                for (int xB = 0; xB < B.numRows; xB++)
                {
                    int indexA = aIndexStart;

                    double total = 0;
                    while (indexA < end)
                    {
                        total += A.data[indexA++] * B.data[indexB++];
                    }

                    C.set(cIndex++, alpha * total);
                }
            }
            //CONCURRENT_ABOVE });
        }
        //CONCURRENT_OMIT_BEGIN

        /**
         * @see CommonOps_DDRM#mult(double, org.ejml.data.DMatrix1Row, org.ejml.data.DMatrix1Row, org.ejml.data.DMatrix1Row)
         */
        public static void mult_aux(double alpha, DMatrix1Row A, DMatrix1Row B, DMatrix1Row C, double[] aux)
        {
            UtilEjml.assertTrue(A != C && B != C, "Neither 'A' or 'B' can be the same matrix as 'C'");
            UtilEjml.assertShape(A.numCols, B.numRows, "The 'A' and 'B' matrices do not have compatible dimensions");
            C.reshape(A.numRows, B.numCols);

            if (aux == null)
            {
                aux = new double[B.numRows];
            }

            for (int j = 0; j < B.numCols; j++)
            {
                // create a copy of the column in B to avoid cache issues
                for (int k = 0; k < B.numRows; k++)
                {
                    aux[k] = B.unsafe_get(k, j);
                }

                int indexA = 0;
                for (int i = 0; i < A.numRows; i++)
                {
                    double total = 0;
                    for (int k = 0; k < B.numRows;)
                    {
                        total += A.data[indexA++] * aux[k++];
                    }
                    C.set(i * C.numCols + j, alpha * total);
                }
            }
        }
示例#6
0
        /**
         * Randomly generates matrix with the specified number of non-zero elements filled with values from min to max.
         *
         * @param numRows Number of rows
         * @param numCols Number of columns
         * @param nz_total Total number of non-zero elements in the matrix
         * @param min Minimum element value, inclusive
         * @param max Maximum element value, inclusive
         * @param rand Random number generator
         * @return Randomly generated matrix
         */
        public static DMatrixSparseCSC rectangle(int numRows, int numCols, int nz_total,
                                                 double min, double max, IMersenneTwister rand)
        {
            nz_total = Math.Min(numCols * numRows, nz_total);
            int[] selected = UtilEjml.shuffled(numRows * numCols, nz_total, rand);
            Array.Sort(selected, 0, nz_total);

            DMatrixSparseCSC ret = new DMatrixSparseCSC(numRows, numCols, nz_total);

            ret.indicesSorted = true;

            // compute the number of elements in each column
            int[] hist = new int[numCols];
            for (int i = 0; i < nz_total; i++)
            {
                hist[selected[i] / numRows]++;
            }

            // define col_idx
            ret.colsum(hist);

            for (int i = 0; i < nz_total; i++)
            {
                int row = selected[i] % numRows;

                ret.nz_rows[i]   = row;
                ret.nz_values[i] = rand.NextDouble() * (max - min) + min;
            }

            return(ret);
        }
示例#7
0
 public static bool hasUncountable(DMatrix6 a)
 {
     if (UtilEjml.isUncountable(a.a1))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a2))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a3))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a4))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a5))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a6))
     {
         return(true);
     }
     return(false);
 }
示例#8
0
 public static bool hasUncountable(DMatrix6x6 a)
 {
     if (UtilEjml.isUncountable(a.a11 + a.a12 + a.a13 + a.a14 + a.a15 + a.a16))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a21 + a.a22 + a.a23 + a.a24 + a.a25 + a.a26))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a31 + a.a32 + a.a33 + a.a34 + a.a35 + a.a36))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a41 + a.a42 + a.a43 + a.a44 + a.a45 + a.a46))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a51 + a.a52 + a.a53 + a.a54 + a.a55 + a.a56))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a61 + a.a62 + a.a63 + a.a64 + a.a65 + a.a66))
     {
         return(true);
     }
     return(false);
 }
        /**
         * @see CommonOps_DDRM#multAdd(double, org.ejml.data.DMatrix1Row, org.ejml.data.DMatrix1Row, org.ejml.data.DMatrix1Row)
         */
        public static void multAdd_small(double alpha, DMatrix1Row A, DMatrix1Row B, DMatrix1Row C)
        {
            UtilEjml.assertTrue(A != C && B != C, "Neither 'A' or 'B' can be the same matrix as 'C'");
            UtilEjml.assertShape(A.numCols, B.numRows, "The 'A' and 'B' matrices do not have compatible dimensions");
            UtilEjml.assertShape(A.numRows == C.numRows && B.numCols == C.numCols, "C is not compatible with A and B");

            //CONCURRENT_BELOW EjmlConcurrency.loopFor(0, A.numRows, i -> {
            for (int i = 0; i < A.numRows; i++)
            {
                int cIndex      = i * B.numCols;
                int aIndexStart = i * A.numCols;
                for (int j = 0; j < B.numCols; j++)
                {
                    double total = 0;

                    int indexA = aIndexStart;
                    int indexB = j;
                    int end    = indexA + B.numRows;
                    while (indexA < end)
                    {
                        total  += A.data[indexA++] * B.data[indexB];
                        indexB += B.numCols;
                    }

                    C.plus(cIndex++, alpha * total);
                }
            }
            //CONCURRENT_ABOVE });
        }
        /**
         * @see CommonOps_DDRM#multTransA(double, org.ejml.data.DMatrix1Row, org.ejml.data.DMatrix1Row, org.ejml.data.DMatrix1Row)
         */
        public static void multTransA_small(double alpha, DMatrix1Row A, DMatrix1Row B, DMatrix1Row C)
        {
            UtilEjml.assertTrue(A != C && B != C, "Neither 'A' or 'B' can be the same matrix as 'C'");
            UtilEjml.assertShape(A.numRows, B.numRows, "The 'A' and 'B' matrices do not have compatible dimensions");
            C.reshape(A.numCols, B.numCols);

            //CONCURRENT_BELOW EjmlConcurrency.loopFor(0, A.numCols, i -> {
            for (int i = 0; i < A.numCols; i++)
            {
                int cIndex = i * B.numCols;
                for (int j = 0; j < B.numCols; j++)
                {
                    int indexA = i;
                    int indexB = j;
                    int end    = indexB + B.numRows * B.numCols;

                    double total = 0;
                    // loop for k
                    for (; indexB < end; indexB += B.numCols)
                    {
                        total  += A.data[indexA] * B.data[indexB];
                        indexA += A.numCols;
                    }

                    C.set(cIndex++, alpha * total);
                }
            }
            //CONCURRENT_ABOVE });
        }
        /**
         * <p>
         * Conjugate transposes input matrix 'a' and stores the results in output matrix 'b':<br>
         * <br>
         * b-real<sub>i,j</sub> = a-real<sub>j,i</sub><br>
         * b-imaginary<sub>i,j</sub> = -1*a-imaginary<sub>j,i</sub><br>
         * where 'b' is the transpose of 'a'.
         * </p>
         *
         * @param input The original matrix.  Not modified.
         * @param output Where the transpose is stored. If null a new matrix is created. Modified.
         * @return The transposed matrix.
         */
        public static ZMatrixRMaj transposeConjugate(ZMatrixRMaj input, ZMatrixRMaj output)
        {
            output = UtilEjml.reshapeOrDeclare(output, input.numCols, input.numRows);

            TransposeAlgs_ZDRM.standardConjugate(input, output);

            return(output);
        }
示例#12
0
        public static bool lower1(DMatrix1Row A, DMatrix1Row L)
        {
            double[] data = A.data;

            double a11 = data[0];

            L.data[0] = Math.Sqrt(a11);
            return(!UtilEjml.isUncountable(L.data[0]));
        }
        public static void elementDiv(DMatrixD1 A, DMatrixD1 B)
        {
            UtilEjml.checkSameShape(A, B, true);

            int length = A.NumElements;

            for (int i = 0; i < length; i++)
            {
                A.div(i, B.get(i));
            }
        }
示例#14
0
 public static bool hasUncountable(DMatrixSparseCSC A)
 {
     for (int i = 0; i < A.nz_length; i++)
     {
         if (UtilEjml.isUncountable(A.nz_values[i]))
         {
             return(true);
         }
     }
     return(false);
 }
示例#15
0
        public bool setA(T A)
        {
            if (alg.modifiesA())
            {
                this.A    = (T)UtilEjml.reshapeOrDeclare(this.A, A);
                this.A.To = A;
                return(alg.setA(this.A));
            }

            return(alg.setA(A));
        }
示例#16
0
        public void solve(T B, T X)
        {
            if (alg.modifiesB())
            {
                this.B    = UtilEjml.reshapeOrDeclare(this.B, B);
                this.B.To = B;
                B         = this.B;
            }

            alg.solve(B, X);
        }
        /**
         * Places the imaginary component of the input matrix into the output matrix.
         *
         * @param input Complex matrix. Not modified.
         * @param output real matrix. Modified.
         */
        public static DMatrixRMaj stripImaginary(ZMatrixD1 input, DMatrixRMaj output)
        {
            output = UtilEjml.reshapeOrDeclare(output, input.numRows, input.numCols);

            int length = input.DataLength;

            for (int i = 1; i < length; i += 2)
            {
                output.data[i / 2] = input.data[i];
            }
            return(output);
        }
        /**
         * <p>Performs the following operation:<br>
         * <br>
         * c = a - b <br>
         * c<sub>ij</sub> = a<sub>ij</sub> - b<sub>ij</sub> <br>
         * </p>
         *
         * <p>
         * Matrix C can be the same instance as Matrix A and/or B.
         * </p>
         *
         * @param a A Matrix. Not modified.
         * @param b A Matrix. Not modified.
         * @param c A Matrix where the results are stored. Modified.
         */
        public static void subtract(ZMatrixD1 a, ZMatrixD1 b, ZMatrixD1 c)
        {
            UtilEjml.checkSameShape(a, b, true);
            c.reshape(a.numRows, b.numCols);

            int length = a.DataLength;

            for (int i = 0; i < length; i++)
            {
                c.data[i] = a.data[i] - b.data[i];
            }
        }
示例#19
0
        //@Override
        public Complex_F64 computeDeterminant()
        {
            // see dense algorithm. There is probably a faster way to compute the sign while decomposing
            // the matrix.
            double value = UtilEjml.permutationSign(pinv, U.numCols, gw.data);

            for (int i = 0; i < U.numCols; i++)
            {
                value *= U.nz_values[U.col_idx[i + 1] - 1];
            }
            return(new Complex_F64(value, 0));
        }
示例#20
0
 public static bool hasUncountable(FMatrix2 a)
 {
     if (UtilEjml.isUncountable(a.a1))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a2))
     {
         return(true);
     }
     return(false);
 }
示例#21
0
 public static bool hasUncountable(DMatrix2x2 a)
 {
     if (UtilEjml.isUncountable(a.a11 + a.a12))
     {
         return(true);
     }
     if (UtilEjml.isUncountable(a.a21 + a.a22))
     {
         return(true);
     }
     return(false);
 }
        public static ZMatrixRMaj diag(ZMatrixRMaj output, int N, double[] data)
        {
            output = UtilEjml.reshapeOrDeclare(output, N, N);

            int index = 0;

            for (int i = 0; i < N; i++)
            {
                output.set(i, i, data[index++], data[index++]);
            }

            return(output);
        }
        override public /**/ double quality()
        {
            return(SpecializedOps_ZDRM.qualityTriangular(R));
        }

        /**
         * Solves for X using the QR decomposition.
         *
         * @param B A matrix that is n by m.  Not modified.
         * @param X An n by m matrix where the solution is written to.  Modified.
         */
        override public void solve(ZMatrixRMaj B, ZMatrixRMaj X)
        {
            UtilEjml.checkReshapeSolve(numRows, numCols, B, X);

            int BnumCols = B.numCols;

            // solve each column one by one
            for (int colB = 0; colB < BnumCols; colB++)
            {
                // make a copy of this column in the vector
                for (int i = 0; i < numRows; i++)
                {
                    int indexB = (i * BnumCols + colB) * 2;
                    a.data[i * 2]     = B.data[indexB];
                    a.data[i * 2 + 1] = B.data[indexB + 1];
                }

                // Solve Qa=b
                // a = Q'b
                // a = Q_{n-1}...Q_2*Q_1*b
                //
                // Q_n*b = (I-gamma*u*u^T)*b = b - u*(gamma*U^T*b)
                for (int n = 0; n < numCols; n++)
                {
                    double[] u = QR[n];

                    double realVV = u[n * 2];
                    double imagVV = u[n * 2 + 1];

                    u[n * 2]     = 1;
                    u[n * 2 + 1] = 0;

                    QrHelperFunctions_ZDRM.rank1UpdateMultR(a, u, 0, gammas[n], 0, n, numRows, temp.data);

                    u[n * 2]     = realVV;
                    u[n * 2 + 1] = imagVV;
                }

                // solve for Rx = b using the standard upper triangular solver
                TriangularSolver_ZDRM.solveU(R.data, a.data, numCols);

                // save the results
                for (int i = 0; i < numCols; i++)
                {
                    int indexB = (i * BnumCols + colB) * 2;
                    X.data[indexB]     = a.data[i * 2];
                    X.data[indexB + 1] = a.data[i * 2 + 1];
                }
            }
        }
        /**
         * <p>
         * Computes the complex conjugate of the input matrix.<br>
         * <br>
         * real<sub>i,j</sub> = real<sub>i,j</sub><br>
         * imaginary<sub>i,j</sub> = -1*imaginary<sub>i,j</sub><br>
         * </p>
         *
         * @param input Input matrix.  Not modified.
         * @param output The complex conjugate of the input matrix.  Modified.
         */
        public static ZMatrixD1 conjugate(ZMatrixD1 input, ZMatrixRMaj output)
        {
            output = UtilEjml.reshapeOrDeclare(output, input.numRows, input.numCols);

            int length = input.DataLength;

            for (int i = 0; i < length; i += 2)
            {
                output.data[i]     = input.data[i];
                output.data[i + 1] = -input.data[i + 1];
            }

            return(output);
        }
示例#25
0
        public static bool lower2(DMatrix1Row A, DMatrix1Row L)
        {
            double[] data = A.data;

            double a11 = data[0];
            double a21 = data[2];
            double a22 = data[3];

            L.data[0] = a11 = Math.Sqrt(a11);
            L.data[1] = 0;
            L.data[2] = a21 = (a21) / a11;
            L.data[3] = Math.Sqrt(a22 - a21 * a21);
            return(!UtilEjml.isUncountable(L.data[3]));
        }
        public static T elementExp <T>(T A, T output)
            where T : DMatrixD1
        {
            output = UtilEjml.reshapeOrDeclare(output, A);

            int size = A.NumElements;

            for (int i = 0; i < size; i++)
            {
                output.data[i] = Math.Exp(A.data[i]);
            }

            return(output);
        }
        public static T elementPower <T>(double a, T B, T output)
            where T : DMatrixD1
        {
            output = UtilEjml.reshapeOrDeclare(output, B);

            int size = B.NumElements;

            for (int i = 0; i < size; i++)
            {
                output.data[i] = Math.Pow(a, B.data[i]);
            }

            return(output);
        }
        public static T elementDiv <T>(T A, T B, T output) where T : DMatrixD1
        {
            UtilEjml.checkSameShape(A, B, true);
            output = UtilEjml.reshapeOrDeclare(output, A);

            int length = A.NumElements;

            for (int i = 0; i < length; i++)
            {
                output.set(i, A.get(i) / B.get(i));
            }

            return(output);
        }
示例#29
0
        public static bool upper2(DMatrix1Row A, DMatrix1Row R)
        {
            double[] data = A.data;

            double a11 = data[0];
            double a12 = data[1];
            double a22 = data[3];

            R.data[0] = a11 = Math.Sqrt(a11);
            R.data[2] = 0;
            R.data[1] = a12 = (a12) / a11;
            R.data[3] = Math.Sqrt(a22 - a12 * a12);
            return(!UtilEjml.isUncountable(R.data[3]));
        }
示例#30
0
        /**
         * <p>
         * Computes the induced p = 2 matrix norm, which is the largest singular value.
         * </p>
         *
         * @param A Matrix. Not modified.
         * @return The norm.
         */
        public static float inducedP2(FMatrixRMaj A)
        {
            SingularValueDecomposition_F32 <FMatrixRMaj> svd =
                DecompositionFactory_FDRM.svd(A.numRows, A.numCols, false, false, true);

            if (!svd.decompose(A))
            {
                throw new InvalidOperationException("Decomposition failed");
            }

            float[] singularValues = svd.getSingularValues();

            // the largest singular value is the induced p2 norm
            return(UtilEjml.max(singularValues, 0, singularValues.Length));
        }