Class Property
- java.lang.Object
-
- cern.colt.PersistentObject
-
- cern.colt.matrix.linalg.Property
-
- All Implemented Interfaces:
java.io.Serializable,java.lang.Cloneable
public class Property extends PersistentObject
Tests matrices for linear algebraic properties (equality, tridiagonality, symmetry, singularity, etc).Except where explicitly indicated, all methods involving equality tests (==) allow for numerical instability, to a degree specified upon instance construction and returned by method
tolerance(). The public static final variable DEFAULT represents a default Property object with a tolerance of 1.0E-9. The public static final variable ZERO represents a Property object with a tolerance of 0.0. The public static final variable TWELVE represents a Property object with a tolerance of 1.0E-12. As long as you are happy with these tolerances, there is no need to construct Property objects. Simply use idioms like Property.DEFAULT.equals(A,B), Property.ZERO.equals(A,B), Property.TWELVE.equals(A,B).To work with a different tolerance (e.g. 1.0E-15 or 1.0E-5) use the constructor and/or method
setTolerance(double). Note that the public static final Property objects are immutable: Is is not possible to alter their tolerance. Any attempt to do so will throw an Exception.Note that this implementation is not synchronized.
Example: equals(DoubleMatrix2D A, DoubleMatrix2D B) is defined as follows
Here are some example properties{ some other tests not related to tolerance go here } double epsilon = tolerance(); for (int row=rows; --row >= 0;) { for (int column=columns; --column >= 0;) { //if (!(A.getQuick(row,column) == B.getQuick(row,column))) return false; if (Math.abs(A.getQuick(row,column) - B.getQuick(row,column)) > epsilon) return false; } } return true;matrix 4 x 4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 04 x 4
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 14 x 4
1 1 0 0
1 1 1 0
0 1 1 1
0 0 1 14 x 4
0 1 1 1
0 1 1 1
0 0 0 1
0 0 0 14 x 4
0 0 0 0
1 1 0 0
1 1 0 0
1 1 1 14 x 4
1 1 0 0
0 1 1 0
0 1 0 1
1 0 1 14 x 4
1 1 1 0
0 1 0 0
1 1 0 1
0 0 1 1upperBandwidth 0013 0 12lowerBandwidth 0010 3 32semiBandwidth 1124 4 43description zerodiagonaltridiagonalupper triangular lower triangular unstructuredunstructured- Version:
- 1.1, 28/May/2000 (fixed strange bugs involving NaN, -inf, inf)
- See Also:
- Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description static PropertyDEFAULTThe default Property object; currently has tolerance()==1.0E-9.protected doubletolerancestatic PropertyTWELVEA Property object with tolerance()==1.0E-12.static PropertyZEROA Property object with tolerance()==0.0.-
Fields inherited from class cern.colt.PersistentObject
serialVersionUID
-
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected static java.lang.Stringblanks(int length)Returns a String with length blanks.voidcheckRectangular(DoubleMatrix2D A)Checks whether the given matrix A is rectangular.voidcheckSquare(DoubleMatrix2D A)Checks whether the given matrix A is square.doubledensity(DoubleMatrix2D A)Returns the matrix's fraction of non-zero cells; A.cardinality() / A.size().booleanequals(DoubleMatrix1D A, double value)Returns whether all cells of the given matrix A are equal to the given value.booleanequals(DoubleMatrix1D A, DoubleMatrix1D B)Returns whether both given matrices A and B are equal.booleanequals(DoubleMatrix2D A, double value)Returns whether all cells of the given matrix A are equal to the given value.booleanequals(DoubleMatrix2D A, DoubleMatrix2D B)Returns whether both given matrices A and B are equal.booleanequals(DoubleMatrix3D A, double value)Returns whether all cells of the given matrix A are equal to the given value.booleanequals(DoubleMatrix3D A, DoubleMatrix3D B)Returns whether both given matrices A and B are equal.voidgenerateNonSingular(DoubleMatrix2D A)Modifies the given matrix square matrix A such that it is diagonally dominant by row and column, hence non-singular, hence invertible.protected static java.lang.Stringget(ObjectArrayList list, int index)booleanisDiagonal(DoubleMatrix2D A)A matrix A is diagonal if A[i,j] == 0 whenever i != j.booleanisDiagonallyDominantByColumn(DoubleMatrix2D A)A matrix A is diagonally dominant by column if the absolute value of each diagonal element is larger than the sum of the absolute values of the off-diagonal elements in the corresponding column.booleanisDiagonallyDominantByRow(DoubleMatrix2D A)A matrix A is diagonally dominant by row if the absolute value of each diagonal element is larger than the sum of the absolute values of the off-diagonal elements in the corresponding row.booleanisIdentity(DoubleMatrix2D A)A matrix A is an identity matrix if A[i,i] == 1 and all other cells are zero.booleanisLowerBidiagonal(DoubleMatrix2D A)A matrix A is lower bidiagonal if A[i,j]==0 unless i==j || i==j+1.booleanisLowerTriangular(DoubleMatrix2D A)A matrix A is lower triangular if A[i,j]==0 whenever i < j.booleanisNonNegative(DoubleMatrix2D A)A matrix A is non-negative if A[i,j] >= 0 holds for all cells.booleanisOrthogonal(DoubleMatrix2D A)A square matrix A is orthogonal if A*transpose(A) = I.booleanisPositive(DoubleMatrix2D A)A matrix A is positive if A[i,j] > 0 holds for all cells.booleanisSingular(DoubleMatrix2D A)A matrix A is singular if it has no inverse, that is, iff det(A)==0.booleanisSkewSymmetric(DoubleMatrix2D A)A square matrix A is skew-symmetric if A = -transpose(A), that is A[i,j] == -A[j,i].booleanisSquare(DoubleMatrix2D A)A matrix A is square if it has the same number of rows and columns.booleanisStrictlyLowerTriangular(DoubleMatrix2D A)A matrix A is strictly lower triangular if A[i,j]==0 whenever i <= j.booleanisStrictlyTriangular(DoubleMatrix2D A)A matrix A is strictly triangular if it is triangular and its diagonal elements all equal 0.booleanisStrictlyUpperTriangular(DoubleMatrix2D A)A matrix A is strictly upper triangular if A[i,j]==0 whenever i >= j.booleanisSymmetric(DoubleMatrix2D A)A matrix A is symmetric if A = tranpose(A), that is A[i,j] == A[j,i].booleanisTriangular(DoubleMatrix2D A)A matrix A is triangular iff it is either upper or lower triangular.booleanisTridiagonal(DoubleMatrix2D A)A matrix A is tridiagonal if A[i,j]==0 whenever Math.abs(i-j) > 1.booleanisUnitTriangular(DoubleMatrix2D A)A matrix A is unit triangular if it is triangular and its diagonal elements all equal 1.booleanisUpperBidiagonal(DoubleMatrix2D A)A matrix A is upper bidiagonal if A[i,j]==0 unless i==j || i==j-1.booleanisUpperTriangular(DoubleMatrix2D A)A matrix A is upper triangular if A[i,j]==0 whenever i > j.booleanisZero(DoubleMatrix2D A)A matrix A is zero if all its cells are zero.intlowerBandwidth(DoubleMatrix2D A)The lower bandwidth of a square matrix A is the maximum i-j for which A[i,j] is nonzero and i > j.intsemiBandwidth(DoubleMatrix2D A)Returns the semi-bandwidth of the given square matrix A.voidsetTolerance(double newTolerance)Sets the tolerance to Math.abs(newTolerance).doubletolerance()Returns the current tolerance.java.lang.StringtoString(DoubleMatrix2D A)Returns summary information about the given matrix A.intupperBandwidth(DoubleMatrix2D A)The upper bandwidth of a square matrix A is the maximum j-i for which A[i,j] is nonzero and j > i.-
Methods inherited from class cern.colt.PersistentObject
clone
-
-
-
-
Field Detail
-
DEFAULT
public static final Property DEFAULT
The default Property object; currently has tolerance()==1.0E-9.
-
ZERO
public static final Property ZERO
A Property object with tolerance()==0.0.
-
TWELVE
public static final Property TWELVE
A Property object with tolerance()==1.0E-12.
-
tolerance
protected double tolerance
-
-
Method Detail
-
blanks
protected static java.lang.String blanks(int length)
Returns a String with length blanks.
-
checkRectangular
public void checkRectangular(DoubleMatrix2D A)
Checks whether the given matrix A is rectangular.- Throws:
java.lang.IllegalArgumentException- if A.rows() < A.columns().
-
checkSquare
public void checkSquare(DoubleMatrix2D A)
Checks whether the given matrix A is square.- Throws:
java.lang.IllegalArgumentException- if A.rows() != A.columns().
-
density
public double density(DoubleMatrix2D A)
Returns the matrix's fraction of non-zero cells; A.cardinality() / A.size().
-
equals
public boolean equals(DoubleMatrix1D A, double value)
Returns whether all cells of the given matrix A are equal to the given value. The result is true if and only if A != null and ! (Math.abs(value - A[i]) > tolerance()) holds for all coordinates.- Parameters:
A- the first matrix to compare.value- the value to compare against.- Returns:
- true if the matrix is equal to the value; false otherwise.
-
equals
public boolean equals(DoubleMatrix1D A, DoubleMatrix1D B)
Returns whether both given matrices A and B are equal. The result is true if A==B. Otherwise, the result is true if and only if both arguments are != null, have the same size and ! (Math.abs(A[i] - B[i]) > tolerance()) holds for all indexes.- Parameters:
A- the first matrix to compare.B- the second matrix to compare.- Returns:
- true if both matrices are equal; false otherwise.
-
equals
public boolean equals(DoubleMatrix2D A, double value)
Returns whether all cells of the given matrix A are equal to the given value. The result is true if and only if A != null and ! (Math.abs(value - A[row,col]) > tolerance()) holds for all coordinates.- Parameters:
A- the first matrix to compare.value- the value to compare against.- Returns:
- true if the matrix is equal to the value; false otherwise.
-
equals
public boolean equals(DoubleMatrix2D A, DoubleMatrix2D B)
Returns whether both given matrices A and B are equal. The result is true if A==B. Otherwise, the result is true if and only if both arguments are != null, have the same number of columns and rows and ! (Math.abs(A[row,col] - B[row,col]) > tolerance()) holds for all coordinates.- Parameters:
A- the first matrix to compare.B- the second matrix to compare.- Returns:
- true if both matrices are equal; false otherwise.
-
equals
public boolean equals(DoubleMatrix3D A, double value)
Returns whether all cells of the given matrix A are equal to the given value. The result is true if and only if A != null and ! (Math.abs(value - A[slice,row,col]) > tolerance()) holds for all coordinates.- Parameters:
A- the first matrix to compare.value- the value to compare against.- Returns:
- true if the matrix is equal to the value; false otherwise.
-
equals
public boolean equals(DoubleMatrix3D A, DoubleMatrix3D B)
Returns whether both given matrices A and B are equal. The result is true if A==B. Otherwise, the result is true if and only if both arguments are != null, have the same number of columns, rows and slices, and ! (Math.abs(A[slice,row,col] - B[slice,row,col]) > tolerance()) holds for all coordinates.- Parameters:
A- the first matrix to compare.B- the second matrix to compare.- Returns:
- true if both matrices are equal; false otherwise.
-
generateNonSingular
public void generateNonSingular(DoubleMatrix2D A)
Modifies the given matrix square matrix A such that it is diagonally dominant by row and column, hence non-singular, hence invertible. For testing purposes only.- Parameters:
A- the square matrix to modify.- Throws:
java.lang.IllegalArgumentException- if !isSquare(A).
-
get
protected static java.lang.String get(ObjectArrayList list, int index)
-
isDiagonal
public boolean isDiagonal(DoubleMatrix2D A)
A matrix A is diagonal if A[i,j] == 0 whenever i != j. Matrix may but need not be square.
-
isDiagonallyDominantByColumn
public boolean isDiagonallyDominantByColumn(DoubleMatrix2D A)
A matrix A is diagonally dominant by column if the absolute value of each diagonal element is larger than the sum of the absolute values of the off-diagonal elements in the corresponding column. returns true if for all i: abs(A[i,i]) > Sum(abs(A[j,i])); j != i. Matrix may but need not be square.Note: Ignores tolerance.
-
isDiagonallyDominantByRow
public boolean isDiagonallyDominantByRow(DoubleMatrix2D A)
A matrix A is diagonally dominant by row if the absolute value of each diagonal element is larger than the sum of the absolute values of the off-diagonal elements in the corresponding row. returns true if for all i: abs(A[i,i]) > Sum(abs(A[i,j])); j != i. Matrix may but need not be square.Note: Ignores tolerance.
-
isIdentity
public boolean isIdentity(DoubleMatrix2D A)
A matrix A is an identity matrix if A[i,i] == 1 and all other cells are zero. Matrix may but need not be square.
-
isLowerBidiagonal
public boolean isLowerBidiagonal(DoubleMatrix2D A)
A matrix A is lower bidiagonal if A[i,j]==0 unless i==j || i==j+1. Matrix may but need not be square.
-
isLowerTriangular
public boolean isLowerTriangular(DoubleMatrix2D A)
A matrix A is lower triangular if A[i,j]==0 whenever i < j. Matrix may but need not be square.
-
isNonNegative
public boolean isNonNegative(DoubleMatrix2D A)
A matrix A is non-negative if A[i,j] >= 0 holds for all cells.Note: Ignores tolerance.
-
isOrthogonal
public boolean isOrthogonal(DoubleMatrix2D A)
A square matrix A is orthogonal if A*transpose(A) = I.- Throws:
java.lang.IllegalArgumentException- if !isSquare(A).
-
isPositive
public boolean isPositive(DoubleMatrix2D A)
A matrix A is positive if A[i,j] > 0 holds for all cells.Note: Ignores tolerance.
-
isSingular
public boolean isSingular(DoubleMatrix2D A)
A matrix A is singular if it has no inverse, that is, iff det(A)==0.
-
isSkewSymmetric
public boolean isSkewSymmetric(DoubleMatrix2D A)
A square matrix A is skew-symmetric if A = -transpose(A), that is A[i,j] == -A[j,i].- Throws:
java.lang.IllegalArgumentException- if !isSquare(A).
-
isSquare
public boolean isSquare(DoubleMatrix2D A)
A matrix A is square if it has the same number of rows and columns.
-
isStrictlyLowerTriangular
public boolean isStrictlyLowerTriangular(DoubleMatrix2D A)
A matrix A is strictly lower triangular if A[i,j]==0 whenever i <= j. Matrix may but need not be square.
-
isStrictlyTriangular
public boolean isStrictlyTriangular(DoubleMatrix2D A)
A matrix A is strictly triangular if it is triangular and its diagonal elements all equal 0. Matrix may but need not be square.
-
isStrictlyUpperTriangular
public boolean isStrictlyUpperTriangular(DoubleMatrix2D A)
A matrix A is strictly upper triangular if A[i,j]==0 whenever i >= j. Matrix may but need not be square.
-
isSymmetric
public boolean isSymmetric(DoubleMatrix2D A)
A matrix A is symmetric if A = tranpose(A), that is A[i,j] == A[j,i].- Throws:
java.lang.IllegalArgumentException- if !isSquare(A).
-
isTriangular
public boolean isTriangular(DoubleMatrix2D A)
A matrix A is triangular iff it is either upper or lower triangular. Matrix may but need not be square.
-
isTridiagonal
public boolean isTridiagonal(DoubleMatrix2D A)
A matrix A is tridiagonal if A[i,j]==0 whenever Math.abs(i-j) > 1. Matrix may but need not be square.
-
isUnitTriangular
public boolean isUnitTriangular(DoubleMatrix2D A)
A matrix A is unit triangular if it is triangular and its diagonal elements all equal 1. Matrix may but need not be square.
-
isUpperBidiagonal
public boolean isUpperBidiagonal(DoubleMatrix2D A)
A matrix A is upper bidiagonal if A[i,j]==0 unless i==j || i==j-1. Matrix may but need not be square.
-
isUpperTriangular
public boolean isUpperTriangular(DoubleMatrix2D A)
A matrix A is upper triangular if A[i,j]==0 whenever i > j. Matrix may but need not be square.
-
isZero
public boolean isZero(DoubleMatrix2D A)
A matrix A is zero if all its cells are zero.
-
lowerBandwidth
public int lowerBandwidth(DoubleMatrix2D A)
The lower bandwidth of a square matrix A is the maximum i-j for which A[i,j] is nonzero and i > j. A banded matrix has a "band" about the diagonal. Diagonal, tridiagonal and triangular matrices are special cases.- Parameters:
A- the square matrix to analyze.- Returns:
- the lower bandwith.
- Throws:
java.lang.IllegalArgumentException- if !isSquare(A).- See Also:
semiBandwidth(DoubleMatrix2D),upperBandwidth(DoubleMatrix2D)
-
semiBandwidth
public int semiBandwidth(DoubleMatrix2D A)
Returns the semi-bandwidth of the given square matrix A. A banded matrix has a "band" about the diagonal. It is a matrix with all cells equal to zero, with the possible exception of the cells along the diagonal line, the k diagonal lines above the diagonal, and the k diagonal lines below the diagonal. The semi-bandwith l is the number k+1. The bandwidth p is the number 2*k + 1. For example, a tridiagonal matrix corresponds to k=1, l=2, p=3, a diagonal or zero matrix corresponds to k=0, l=1, p=1,The upper bandwidth is the maximum j-i for which A[i,j] is nonzero and j > i. The lower bandwidth is the maximum i-j for which A[i,j] is nonzero and i > j. Diagonal, tridiagonal and triangular matrices are special cases.
Examples:
matrix 4 x 4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 04 x 4
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 14 x 4
1 1 0 0
1 1 1 0
0 1 1 1
0 0 1 14 x 4
0 1 1 1
0 1 1 1
0 0 0 1
0 0 0 14 x 4
0 0 0 0
1 1 0 0
1 1 0 0
1 1 1 14 x 4
1 1 0 0
0 1 1 0
0 1 0 1
1 0 1 14 x 4
1 1 1 0
0 1 0 0
1 1 0 1
0 0 1 1upperBandwidth 0013 0 12lowerBandwidth 0010 3 32semiBandwidth 1124 4 43description zerodiagonaltridiagonalupper triangular lower triangular unstructuredunstructured- Parameters:
A- the square matrix to analyze.- Returns:
- the semi-bandwith l.
- Throws:
java.lang.IllegalArgumentException- if !isSquare(A).- See Also:
lowerBandwidth(DoubleMatrix2D),upperBandwidth(DoubleMatrix2D)
-
setTolerance
public void setTolerance(double newTolerance)
Sets the tolerance to Math.abs(newTolerance).- Throws:
java.lang.UnsupportedOperationException- if this==DEFAULT || this==ZERO || this==TWELVE.
-
tolerance
public double tolerance()
Returns the current tolerance.
-
toString
public java.lang.String toString(DoubleMatrix2D A)
Returns summary information about the given matrix A. That is a String with (propertyName, propertyValue) pairs. Useful for debugging or to quickly get the rough picture of a matrix. For example,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.
-
upperBandwidth
public int upperBandwidth(DoubleMatrix2D A)
The upper bandwidth of a square matrix A is the maximum j-i for which A[i,j] is nonzero and j > i. A banded matrix has a "band" about the diagonal. Diagonal, tridiagonal and triangular matrices are special cases.- Parameters:
A- the square matrix to analyze.- Returns:
- the upper bandwith.
- Throws:
java.lang.IllegalArgumentException- if !isSquare(A).- See Also:
semiBandwidth(DoubleMatrix2D),lowerBandwidth(DoubleMatrix2D)
-
-