|
Parallel Colt 0.7.2 | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object cern.colt.PersistentObject cern.colt.matrix.AbstractMatrix cern.colt.matrix.AbstractMatrix2D cern.colt.matrix.tint.IntMatrix2D cern.colt.matrix.tint.impl.WrapperIntMatrix2D cern.colt.matrix.tint.impl.RCIntMatrix2D
public class RCIntMatrix2D
Sparse row-compressed 2-d matrix holding int elements. First see the package summary and javadoc tree view to get the broad picture.
Implementation:
Internally uses the standard sparse row-compressed format, with two important differences that broaden the applicability of this storage format:
IntArrayList
and
IntArrayList
to hold the column indexes and
nonzero values, respectively. This improves set(...) performance, because the
standard way of using non-resizable primitive arrays causes excessive memory
allocation, garbage collection and array copying. The small downside of this
is that set(...,0) does not free memory (The capacity of an arraylist does
not shrink upon element removal).
Memory requirements:
Cells that
trimToSize()
.
memory [bytes] = 4*rows + 12 * nonZeros.
Where nonZeros = cardinality() is the number of non-zero cells.
Thus, a 1000 x 1000 matrix with 1000000 non-zero cells consumes 11.5 MB. The
same 1000 x 1000 matrix with 1000 non-zero cells consumes 15 KB.
Time complexity:
Getting a cell value takes time O(log nzr) where nzr is the number of non-zeros of the touched row. This is usually quick, because typically there are only few nonzeros per row. So, in practice, get has expected constant time. Setting a cell value takes worst-case time O(nz) where nzr is the total number of non-zeros in the matrix. This can be extremely slow, but if you traverse coordinates properly (i.e. upwards), each write is done much quicker:
// rather quick matrix.assign(0); for (int row = 0; row < rows; row++) { for (int column = 0; column < columns; column++) { if (someCondition) matrix.setQuick(row, column, someValue); } } // poor matrix.assign(0); for (int row = rows; --row >= 0;) { for (int column = columns; --column >= 0;) { if (someCondition) matrix.setQuick(row, column, someValue); } } |
Fast iteration over non-zeros can be done via forEachNonZero(cern.colt.function.tint.IntIntIntFunction)
, which
supplies your function with row, column and value of each nonzero. Although
the internally implemented version is a bit more sophisticated, here is how a
quite efficient user-level matrix-vector multiplication could look like:
// Linear algebraic y = A * x A.forEachNonZero(new cern.colt.function.IntIntIntFunction() { public int apply(int row, int column, int value) { y.setQuick(row, y.getQuick(row) + value * x.getQuick(column)); return value; } }); |
Here is how a a quite efficient user-level combined scaling operation could look like:
// Elementwise A = A + alpha*B B.forEachNonZero(new cern.colt.function.IntIntIntFunction() { public int apply(int row, int column, int value) { A.setQuick(row, column, A.getQuick(row, column) + alpha * value); return value; } }); |
assign(IntMatrix2D,cern.colt.function.tint.IntIntFunction)
does just that if you supply
IntFunctions.plusMultSecond(int)
as argument.
Field Summary |
---|
Fields inherited from class cern.colt.PersistentObject |
---|
serialVersionUID |
Constructor Summary | |
---|---|
RCIntMatrix2D(int[][] values)
Constructs a matrix with a copy of the given values. |
|
RCIntMatrix2D(int rows,
int columns)
Constructs a matrix with a given number of rows and columns. |
|
RCIntMatrix2D(int rows,
int columns,
int nzmax)
Constructs a matrix with a given number of rows and columns. |
|
RCIntMatrix2D(int rows,
int columns,
int[] rowPointers,
IntArrayList columnIndexes,
IntArrayList values)
|
Method Summary | |
---|---|
IntMatrix2D |
assign(int value)
Sets all nonzero cells to the state specified by value. |
IntMatrix2D |
assign(IntFunction function)
Assigns the result of a function to each nonzero cell; |
IntMatrix2D |
assign(IntMatrix2D source)
Replaces all cell values of the receiver with the values of another matrix. |
IntMatrix2D |
assign(IntMatrix2D y,
IntIntFunction function)
Assigns the result of a function to each cell; x[row,col] = function(x[row,col],y[row,col]). |
int |
cardinality()
Returns the number of cells having non-zero values; ignores tolerance. |
IntMatrix2D |
forEachNonZero(IntIntIntFunction function)
Assigns the result of a function to each non-zero cell; x[row,col] = function(x[row,col]). |
IntArrayList |
getColumnindexes()
|
DenseIntMatrix2D |
getFull()
|
int |
getQuick(int row,
int column)
Returns the matrix cell value at coordinate [row,column]. |
int[] |
getRowPointers()
|
IntArrayList |
getValues()
|
IntMatrix2D |
like(int rows,
int columns)
Construct and returns a new empty matrix of the same dynamic type as the receiver, having the specified number of rows and columns. |
IntMatrix1D |
like1D(int size)
Construct and returns a new 1-d matrix of the corresponding dynamic type, entirely independent of the receiver. |
void |
setQuick(int row,
int column,
int value)
Sets the matrix cell at coordinate [row,column] to the specified value. |
void |
trimToSize()
Releases any superfluous internal memory. |
IntMatrix1D |
zMult(IntMatrix1D y,
IntMatrix1D z)
Linear algebraic matrix-vector multiplication; z = A * y; Equivalent to return A.zMult(y,z,1,0); |
IntMatrix1D |
zMult(IntMatrix1D y,
IntMatrix1D z,
int alpha,
int beta,
boolean transposeA)
Linear algebraic matrix-vector multiplication; z = alpha * A * y + beta*z. |
IntMatrix2D |
zMult(IntMatrix2D B,
IntMatrix2D C)
Linear algebraic matrix-matrix multiplication; C = A x B; Equivalent to A.zMult(B,C,1,0,false,false). |
IntMatrix2D |
zMult(IntMatrix2D B,
IntMatrix2D C,
int alpha,
int beta,
boolean transposeA,
boolean transposeB)
Linear algebraic matrix-matrix multiplication; C = alpha * A x B + beta*C. |
Methods inherited from class cern.colt.matrix.tint.impl.WrapperIntMatrix2D |
---|
elements, setNcolumns, setNrows, vectorize, viewColumn, viewColumnFlip, viewDice, viewPart, viewRow, viewRowFlip, viewSelection, viewStrides |
Methods inherited from class cern.colt.matrix.tint.IntMatrix2D |
---|
aggregate, aggregate, aggregate, aggregate, assign, assign, assign, assign, assign, copy, equals, equals, get, getMaxLocation, getMinLocation, getNegativeValues, getNonZeros, getPositiveValues, like, set, toArray, toString, viewSelection, viewSelection, viewSorted, zSum |
Methods inherited from class cern.colt.matrix.AbstractMatrix2D |
---|
checkShape, checkShape, columns, columnStride, index, rows, rowStride, size, toStringShort |
Methods inherited from class cern.colt.matrix.AbstractMatrix |
---|
ensureCapacity, isView |
Methods inherited from class cern.colt.PersistentObject |
---|
clone |
Methods inherited from class java.lang.Object |
---|
getClass, hashCode, notify, notifyAll, wait, wait, wait |
Constructor Detail |
---|
public RCIntMatrix2D(int[][] values)
The values are copied. So subsequent changes in values are not reflected in the matrix, and vice-versa.
values
- The values to be filled into the new matrix.
IllegalArgumentException
- if
for any 1 <= row < values.length: values[row].length != values[row-1].length
.public RCIntMatrix2D(int rows, int columns, int[] rowPointers, IntArrayList columnIndexes, IntArrayList values)
public RCIntMatrix2D(int rows, int columns)
rows
- the number of rows the matrix shall have.columns
- the number of columns the matrix shall have.
IllegalArgumentException
- if
rows<0 || columns<0 || (int)columns*rows > Integer.MAX_VALUE
.public RCIntMatrix2D(int rows, int columns, int nzmax)
rows
- the number of rows the matrix shall have.columns
- the number of columns the matrix shall have.
IllegalArgumentException
- if
rows<0 || columns<0 || (int)columns*rows > Integer.MAX_VALUE
.Method Detail |
---|
public IntMatrix2D assign(int value)
assign
in class IntMatrix2D
value
- the value to be filled into the cells.
public IntMatrix2D assign(IntFunction function)
assign
in class IntMatrix2D
function
- a function object taking as argument the current cell's value.
IntFunctions
public IntMatrix2D assign(IntMatrix2D source)
assign
in class IntMatrix2D
source
- the source matrix to copy from (may be identical to the
receiver).
IllegalArgumentException
- if
columns() != source.columns() || rows() != source.rows()public IntMatrix2D assign(IntMatrix2D y, IntIntFunction function)
IntMatrix2D
Example:
// assign x[row,col] = x[row,col]<sup>y[row,col]</sup> m1 = 2 x 2 matrix 0 1 2 3 m2 = 2 x 2 matrix 0 2 4 6 m1.assign(m2, cern.jet.math.Functions.pow); --> m1 == 2 x 2 matrix 1 1 16 729For further examples, see the package doc.
assign
in class IntMatrix2D
y
- the secondary matrix to operate on.function
- a function object taking as first argument the current cell's
value of this, and as second argument the current
cell's value of y,
IntFunctions
public IntMatrix2D forEachNonZero(IntIntIntFunction function)
IntMatrix2D
forEachNonZero
in class IntMatrix2D
function
- a function object taking as argument the current non-zero
cell's row, column and value.
public IntArrayList getColumnindexes()
public int[] getRowPointers()
public IntArrayList getValues()
public int getQuick(int row, int column)
Provided with invalid parameters this method may return invalid objects without throwing any exception. You should only use this method when you are absolutely sure that the coordinate is within bounds. Precondition (unchecked): 0 <= column < columns() && 0 <= row < rows().
getQuick
in class WrapperIntMatrix2D
row
- the index of the row-coordinate.column
- the index of the column-coordinate.
public IntMatrix2D like(int rows, int columns)
like
in class WrapperIntMatrix2D
rows
- the number of rows the matrix shall have.columns
- the number of columns the matrix shall have.
public IntMatrix1D like1D(int size)
like1D
in class WrapperIntMatrix2D
size
- the number of cells the matrix shall have.
public int cardinality()
IntMatrix2D
cardinality
in class IntMatrix2D
public void setQuick(int row, int column, int value)
Provided with invalid parameters this method may access illegal indexes without throwing any exception. You should only use this method when you are absolutely sure that the coordinate is within bounds. Precondition (unchecked): 0 <= column < columns() && 0 <= row < rows().
setQuick
in class WrapperIntMatrix2D
row
- the index of the row-coordinate.column
- the index of the column-coordinate.value
- the value to be filled into the specified cell.public DenseIntMatrix2D getFull()
public void trimToSize()
AbstractMatrix
This default implementation does nothing. Override this method if necessary.
trimToSize
in class AbstractMatrix
public IntMatrix1D zMult(IntMatrix1D y, IntMatrix1D z)
IntMatrix2D
zMult
in class IntMatrix2D
public IntMatrix1D zMult(IntMatrix1D y, IntMatrix1D z, int alpha, int beta, boolean transposeA)
IntMatrix2D
zMult
in class IntMatrix2D
y
- the source vector.z
- the vector where results are to be stored. Set this parameter
to null to indicate that a new result vector shall be
constructed.
public IntMatrix2D zMult(IntMatrix2D B, IntMatrix2D C)
IntMatrix2D
zMult
in class IntMatrix2D
public IntMatrix2D zMult(IntMatrix2D B, IntMatrix2D C, int alpha, int beta, boolean transposeA, boolean transposeB)
IntMatrix2D
zMult
in class IntMatrix2D
B
- the second source matrix.C
- the matrix where results are to be stored. Set this parameter
to null to indicate that a new result matrix shall be
constructed.
|
Parallel Colt 0.7.2 | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |