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; } } }
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); }
/// <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()); }
protected void RunSort(int fromIndex, int toIndex, IntComparator c, Cern.Colt.Swapper swapper) { Cern.Colt.GenericSorting.QuickSort(fromIndex, toIndex, c, swapper); }
public static void Permute(int[] indexes, Cern.Colt.Swapper swapper, int[] work) { Permute(indexes, swapper, work, null); }
/// <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()); } }