Example #1
0
        public static void Permute(int[] indexes, Cern.Colt.Swapper swapper, int[] work1, int[] work2)
        {
            // "tracks" and "pos" keeps track of the current indexes of the elements
            // Example: We have a list==[A,B,C,D,E], indexes==[0,4,1,2,3] and swap B and E we need to know that the element formlerly at index 1 is now at index 4, and the one formerly at index 4 is now at index 1.
            // Otherwise we stumble over our own feet and produce nonsense.
            // Initially index i really is at index i, but this will change due to swapping.

            // work1, work2 to avoid high frequency memalloc's
            int s = indexes.Length;

            int[] tracks = work1;
            int[] pos    = work2;
            if (tracks == null || tracks.Length < s)
            {
                tracks = new int[s];
            }
            if (pos == null || pos.Length < s)
            {
                pos = new int[s];
            }
            for (int i = s; --i >= 0;)
            {
                tracks[i] = i;
                pos[i]    = i;
            }

            for (int i = 0; i < s; i++)
            {
                int index = indexes[i];
                int track = tracks[index];

                if (i != track)
                {
                    swapper(i, track);
                    tracks[index] = i; tracks[pos[i]] = track;
                    int tmp = pos[i]; pos[i] = pos[track]; pos[track] = tmp;
                }
            }
        }
Example #2
0
        public static DoubleMatrix2D PermuteRows(DoubleMatrix2D A, int[] indexes, int[] work)
        {
            // check validity
            int size = A.Rows;

            if (indexes.Length != size)
            {
                throw new IndexOutOfRangeException("invalid permutation");
            }

            /*
             * int i=size;
             * int a;
             * while (--i >= 0 && (a=indexes[i])==i) if (a < 0 || a >= size) throw new IndexOutOfRangeException("invalid permutation");
             * if (i<0) return; // nothing to permute
             */

            int columns = A.Columns;

            if (columns < size / 10)
            { // quicker
                double[] doubleWork = new double[size];
                for (int j = A.Columns; --j >= 0;)
                {
                    Permute(A.ViewColumn(j), indexes, doubleWork);
                }
                return(A);
            }

            var swapper = new Cern.Colt.Swapper((a, b) =>
            {
                A.ViewRow(a).Swap(A.ViewRow(b));
            }
                                                );

            Cern.Colt.GenericPermuting.permute(indexes, swapper, work, null);
            return(A);
        }
Example #3
0
        /// <summary>
        /// Returns summary information about the given matrix<i> A</i>.
        /// That is a String with (propertyName, propertyValue) pairs.
        /// Useful for debugging or to quickly get the rough picture of a matrix.
        ///         For example,
        ///         <pre>
        /// density                      : 0.9
        /// isDiagonal                   : false
        /// isDiagonallyDominantByRow    : false
        /// isDiagonallyDominantByColumn : false
        /// isIdentity                   : false
        /// isLowerBidiagonal            : false
        /// isLowerTriangular            : false
        /// isNonNegative                : true
        /// isOrthogonal                 : Illegal operation or error: Matrix must be square.
        /// isPositive                   : true
        /// isSingular                   : Illegal operation or error: Matrix must be square.
        /// isSkewSymmetric              : Illegal operation or error: Matrix must be square.
        /// isSquare                     : false
        /// isStrictlyLowerTriangular    : false
        /// isStrictlyTriangular         : false
        /// isStrictlyUpperTriangular    : false
        /// isSymmetric                  : Illegal operation or error: Matrix must be square.
        /// isTriangular                 : false
        /// isTridiagonal                : false
        /// isUnitTriangular             : false
        /// isUpperBidiagonal            : false
        /// isUpperTriangular            : false
        /// isZero                       : false
        /// lowerBandwidth               : Illegal operation or error: Matrix must be square.
        /// semiBandwidth                : Illegal operation or error: Matrix must be square.
        /// upperBandwidth               : Illegal operation or error: Matrix must be square.
        /// </pre>
        /// <summary>
        public String ToString(DoubleMatrix2D A)
        {
            var    names   = new List <Object>();
            var    values  = new List <Object>();
            String unknown = "Illegal operation or error: ";

            // determine properties
            names.Add("density");
            try { values.Add(Density(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            // determine properties
            names.Add("isDiagonal");
            try { values.Add(IsDiagonal(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            // determine properties
            names.Add("isDiagonallyDominantByRow");
            try { values.Add(IsDiagonallyDominantByRow(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            // determine properties
            names.Add("isDiagonallyDominantByColumn");
            try { values.Add(IsDiagonallyDominantByColumn(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isIdentity");
            try { values.Add(IsIdentity(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isLowerBidiagonal");
            try { values.Add(IsLowerBidiagonal(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isLowerTriangular");
            try { values.Add(IsLowerTriangular(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isNonNegative");
            try { values.Add(IsNonNegative(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isOrthogonal");
            try { values.Add(IsOrthogonal(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isPositive");
            try { values.Add(IsPositive(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isSingular");
            try { values.Add(IsSingular(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isSkewSymmetric");
            try { values.Add(IsSkewSymmetric(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isSquare");
            try { values.Add(IsSquare(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isStrictlyLowerTriangular");
            try { values.Add(IsStrictlyLowerTriangular(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isStrictlyTriangular");
            try { values.Add(IsStrictlyTriangular(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isStrictlyUpperTriangular");
            try { values.Add(IsStrictlyUpperTriangular(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isSymmetric");
            try { values.Add(IsSymmetric(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isTriangular");
            try { values.Add(IsTriangular(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isTridiagonal");
            try { values.Add(IsTridiagonal(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isUnitTriangular");
            try { values.Add(IsUnitTriangular(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isUpperBidiagonal");
            try { values.Add(IsUpperBidiagonal(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isUpperTriangular");
            try { values.Add(IsUpperTriangular(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("isZero");
            try { values.Add(IsZero(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("lowerBandwidth");
            try { values.Add(LowerBandwidth(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("semiBandwidth");
            try { values.Add(SemiBandwidth(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("upperBandwidth");
            try { values.Add(UpperBandwidth(A).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }


            // sort ascending by property name
            Cern.Colt.Function.IntComparator comp = new Cern.Colt.Function.IntComparator((a, b) =>
            {
                return(names[a].ToString().CompareTo(names[b].ToString()));
            }
                                                                                         );

            Cern.Colt.Swapper swapper = new Cern.Colt.Swapper((a, b) =>
            {
                Object tmp;
                tmp = names[a]; names[a] = names[b]; names[b] = tmp;
                tmp = values[a]; values[a] = values[b]; values[b] = tmp;
            });

            Cern.Colt.GenericSorting.QuickSort(0, names.Count, comp, swapper);

            // determine padding for nice formatting
            int maxLength = 0;

            for (int i = 0; i < names.Count; i++)
            {
                int Length = ((String)names[i]).Length;
                maxLength = System.Math.Max(Length, maxLength);
            }

            // finally, format properties
            StringBuilder buf = new StringBuilder();

            for (int i = 0; i < names.Count; i++)
            {
                String name = ((String)names[i]);
                buf.Append(name);
                buf.Append(Blanks(maxLength - name.Length));
                buf.Append(" : ");
                buf.Append(values[i]);
                if (i < names.Count - 1)
                {
                    buf.Append('\n');
                }
            }

            return(buf.ToString());
        }
Example #4
0
 protected void RunSort(int fromIndex, int toIndex, IntComparator c, Cern.Colt.Swapper swapper)
 {
     Cern.Colt.GenericSorting.QuickSort(fromIndex, toIndex, c, swapper);
 }
Example #5
0
 public static void Permute(int[] indexes, Cern.Colt.Swapper swapper, int[] work)
 {
     Permute(indexes, swapper, work, null);
 }
Example #6
0
        /// <summary>
        /// Returns a String with (propertyName, propertyValue) pairs.
        /// Useful for debugging or to quickly get the rough picture.
        /// </summary>
        /// <param name="matrix"></param>
        /// <returns></returns>
        /// <example>
        /// Cond          : 14.073264490042144
        /// Det           : Illegal operation or error: Matrix must be square.
        /// Norm1         : 0.9620244354009628
        /// Norm2         : 3.0
        /// NormF         : 1.304841791648992
        /// NormInfinity  : 1.5406551198102534
        /// Rank          : 3
        /// Trace         : 0
        /// </example>
        public static String ToString(DoubleMatrix2D matrix)
        {
            List <Object> names   = new List <Object>();
            List <Object> values  = new List <Object>();
            String        unknown = "Illegal operation or error: ";

            // determine properties
            names.Add("cond");
            try { values.Add(Cond(matrix).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("det");
            try { values.Add(Det(matrix).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("norm1");
            try { values.Add(Norm1(matrix).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("norm2");
            try { values.Add(Norm2(matrix).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("normF");
            try { values.Add(NormF(matrix).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("normInfinity");
            try { values.Add(NormInfinity(matrix).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("rank");
            try { values.Add(Rank(matrix).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }

            names.Add("trace");
            try { values.Add(Trace(matrix).ToString()); }
            catch (ArgumentException exc) { values.Add(unknown + exc.Message); }


            // sort ascending by property name
            Cern.Colt.Function.IntComparator comp = new Cern.Colt.Function.IntComparator((a, b) =>
            {
                return(names[a].ToString().CompareTo(names[b]));
            }
                                                                                         );
            {
                Cern.Colt.Swapper swapper = new Cern.Colt.Swapper((a, b) =>
                {
                    Object tmp;
                    tmp = names[a]; names[a] = names[b]; names[b] = tmp;
                    tmp = values[a]; values[a] = values[b]; values[b] = tmp;
                }
                                                                  );
                Cern.Colt.GenericSorting.QuickSort(0, names.Count, comp, swapper);

                // determine padding for nice formatting
                int maxLength = 0;
                for (int i = 0; i < names.Count; i++)
                {
                    int Length = ((String)names[i]).Length;
                    maxLength = System.Math.Max(Length, maxLength);
                }

                // finally, format properties
                StringBuilder buf = new StringBuilder();
                for (int i = 0; i < names.Count; i++)
                {
                    String name = ((String)names[i]);
                    buf.Append(name);
                    buf.Append(Property.Blanks(maxLength - name.Length));
                    buf.Append(" : ");
                    buf.Append(values[i]);
                    if (i < names.Count - 1)
                    {
                        buf.Append('\n');
                    }
                }

                return(buf.ToString());
            }
        }