checkRowIndexes(rowIndexes); checkColumnIndexes(columnIndexes); int[] rowOffsets = new int[rowIndexes.length]; int[] columnOffsets = new int[columnIndexes.length]; for (int i=rowIndexes.length; --i >= 0; ) { rowOffsets[i] = _rowOffset(_rowRank(rowIndexes[i])); columnOffsets[i] = _columnOffset(_columnRank(columnIndexes[i])); return viewSelectionLike(rowOffsets,columnOffsets);
/** Constructs a diagonal block matrix from the given parts. The concatenation has the form <pre> A 0 0 0 B 0 0 0 C </pre> from the given parts. Cells are copied. */ public ObjectMatrix2D composeDiagonal(ObjectMatrix2D A, ObjectMatrix2D B, ObjectMatrix2D C) { ObjectMatrix2D diag = make(A.rows()+B.rows()+C.rows(), A.columns()+B.columns()+C.columns()); diag.viewPart(0,0,A.rows(),A.columns()).assign(A); diag.viewPart(A.rows(),A.columns(),B.rows(),B.columns()).assign(B); diag.viewPart(A.rows()+B.rows(),A.columns()+B.columns(),C.rows(),C.columns()).assign(C); return diag; } /**
/** Constructs and returns a new <i>slice view</i> representing the rows of the given column. The returned view is backed by this matrix, so changes in the returned view are reflected in this matrix, and vice-versa. To obtain a slice view on subranges, construct a sub-ranging view (<tt>viewPart(...)</tt>), then apply this method to the sub-range view. <p> <b>Example:</b> <table border="0"> <tr nowrap> <td valign="top">2 x 3 matrix: <br> 1, 2, 3<br> 4, 5, 6 </td> <td>viewColumn(0) ==></td> <td valign="top">Matrix1D of size 2:<br> 1, 4</td> </tr> </table> @param column the column to fix. @return a new slice view. @throws IndexOutOfBoundsException if <tt>column < 0 || column >= columns()</tt>. @see #viewRow(int) */ public ObjectMatrix1D viewColumn(int column) { checkColumn(column); int viewSize = this.rows; int viewZero = index(0,column); int viewStride = this.rowStride; return like1D(viewSize,viewZero,viewStride); } /**
/** * Constructs and returns a deep copy of the receiver. * <p> * <b>Note that the returned matrix is an independent deep copy.</b> * The returned matrix is not backed by this matrix, so changes in the returned matrix are not reflected in this matrix, and vice-versa. * * @return a deep copy of the receiver. */ public ObjectMatrix2D copy() { return like().assign(this); } /**
/** Constructs and returns a new <i>slice view</i> representing the columns of the given row. The returned view is backed by this matrix, so changes in the returned view are reflected in this matrix, and vice-versa. To obtain a slice view on subranges, construct a sub-ranging view (<tt>viewPart(...)</tt>), then apply this method to the sub-range view. <p> <b>Example:</b> <table border="0"> <tr nowrap> <td valign="top">2 x 3 matrix: <br> 1, 2, 3<br> 4, 5, 6 </td> <td>viewRow(0) ==></td> <td valign="top">Matrix1D of size 3:<br> 1, 2, 3</td> </tr> </table> @param row the row to fix. @return a new slice view. @throws IndexOutOfBoundsException if <tt>row < 0 || row >= rows()</tt>. @see #viewColumn(int) */ public ObjectMatrix1D viewRow(int row) { checkRow(row); int viewSize = this.columns; int viewZero = index(row,0); int viewStride = this.columnStride; return like1D(viewSize,viewZero,viewStride); } /**
if (matrix.size()==0) return "Empty matrix"; String oldFormat = this.format; this.format = LEFT; int rows = matrix.rows(); int columns = matrix.columns(); cern.colt.matrix.ObjectMatrix2D titleMatrix = matrix.like(height, width); titleMatrix.viewPart(r,c,rows,columns).assign(matrix); if (r>0) titleMatrix.viewRow(0).viewPart(c,columns).assign(columnNames); String[] rowAxisStrings = new String[rowAxisName.length()]; for (int i=rowAxisName.length(); --i >= 0; ) rowAxisStrings[i] = rowAxisName.substring(i,i+1); titleMatrix.viewColumn(0).viewPart(r,rowAxisName.length()).assign(rowAxisStrings); if (rowNames!=null) titleMatrix.viewColumn(c-2).viewPart(r,rows).assign(rowNames); if (c>0) titleMatrix.viewColumn(c-2+1).viewPart(0,rows+r).assign("|");
/** * Constructs a matrix with the given shape, each cell initialized with the given value. */ public ObjectMatrix2D make(int rows, int columns, Object initialValue) { if (initialValue == null) return make(rows,columns); return make(rows,columns).assign(initialValue); } /**
/** * Returns the number of cells having non-zero values. */ public int cardinality() { if (this.isNoView) return this.elements.size(); else return super.cardinality(); } /**
if (matrix.size()==0) return "Empty matrix"; String oldFormat = this.format; this.format = LEFT; int rows = matrix.rows(); int columns = matrix.columns(); cern.colt.matrix.ObjectMatrix2D titleMatrix = matrix.like(height, width); titleMatrix.viewPart(r,c,rows,columns).assign(matrix); if (r>0) titleMatrix.viewRow(0).viewPart(c,columns).assign(columnNames); String[] rowAxisStrings = new String[rowAxisName.length()]; for (int i=rowAxisName.length(); --i >= 0; ) rowAxisStrings[i] = rowAxisName.substring(i,i+1); titleMatrix.viewColumn(0).viewPart(r,rowAxisName.length()).assign(rowAxisStrings); if (rowNames!=null) titleMatrix.viewColumn(c-2).viewPart(r,rows).assign(rowNames); if (c>0) titleMatrix.viewColumn(c-2+1).viewPart(0,rows+r).assign("|");
/** Constructs and returns a new <i>slice view</i> representing the columns of the given row. The returned view is backed by this matrix, so changes in the returned view are reflected in this matrix, and vice-versa. To obtain a slice view on subranges, construct a sub-ranging view (<tt>viewPart(...)</tt>), then apply this method to the sub-range view. <p> <b>Example:</b> <table border="0"> <tr nowrap> <td valign="top">2 x 3 matrix: <br> 1, 2, 3<br> 4, 5, 6 </td> <td>viewRow(0) ==></td> <td valign="top">Matrix1D of size 3:<br> 1, 2, 3</td> </tr> </table> @param row the row to fix. @return a new slice view. @throws IndexOutOfBoundsException if <tt>row < 0 || row >= rows()</tt>. @see #viewColumn(int) */ public ObjectMatrix1D viewRow(int row) { checkRow(row); int viewSize = this.columns; int viewZero = index(row,0); int viewStride = this.columnStride; return like1D(viewSize,viewZero,viewStride); } /**
/** * Constructs a matrix with the given shape, each cell initialized with the given value. */ public ObjectMatrix2D make(int rows, int columns, Object initialValue) { if (initialValue == null) return make(rows,columns); return make(rows,columns).assign(initialValue); } /**
/** * Constructs and returns a deep copy of the receiver. * <p> * <b>Note that the returned matrix is an independent deep copy.</b> * The returned matrix is not backed by this matrix, so changes in the returned matrix are not reflected in this matrix, and vice-versa. * * @return a deep copy of the receiver. */ public ObjectMatrix2D copy() { return like().assign(this); } /**
/** * Returns the number of cells having non-zero values. */ public int cardinality() { if (this.isNoView) return this.elements.size(); else return super.cardinality(); } /**
/** Constructs a diagonal block matrix from the given parts. The concatenation has the form <pre> A 0 0 0 B 0 0 0 C </pre> from the given parts. Cells are copied. */ public ObjectMatrix2D composeDiagonal(ObjectMatrix2D A, ObjectMatrix2D B, ObjectMatrix2D C) { ObjectMatrix2D diag = make(A.rows()+B.rows()+C.rows(), A.columns()+B.columns()+C.columns()); diag.viewPart(0,0,A.rows(),A.columns()).assign(A); diag.viewPart(A.rows(),A.columns(),B.rows(),B.columns()).assign(B); diag.viewPart(A.rows()+B.rows(),A.columns()+B.columns(),C.rows(),C.columns()).assign(C); return diag; } /**
checkRowIndexes(rowIndexes); checkColumnIndexes(columnIndexes); int[] rowOffsets = new int[rowIndexes.length]; int[] columnOffsets = new int[columnIndexes.length]; for (int i=rowIndexes.length; --i >= 0; ) { rowOffsets[i] = _rowOffset(_rowRank(rowIndexes[i])); columnOffsets[i] = _columnOffset(_columnRank(columnIndexes[i])); return viewSelectionLike(rowOffsets,columnOffsets);
/** Constructs and returns a new <i>slice view</i> representing the rows of the given column. The returned view is backed by this matrix, so changes in the returned view are reflected in this matrix, and vice-versa. To obtain a slice view on subranges, construct a sub-ranging view (<tt>viewPart(...)</tt>), then apply this method to the sub-range view. <p> <b>Example:</b> <table border="0"> <tr nowrap> <td valign="top">2 x 3 matrix: <br> 1, 2, 3<br> 4, 5, 6 </td> <td>viewColumn(0) ==></td> <td valign="top">Matrix1D of size 2:<br> 1, 4</td> </tr> </table> @param column the column to fix. @return a new slice view. @throws IndexOutOfBoundsException if <tt>column < 0 || column >= columns()</tt>. @see #viewRow(int) */ public ObjectMatrix1D viewColumn(int column) { checkColumn(column); int viewSize = this.rows; int viewZero = index(0,column); int viewStride = this.rowStride; return like1D(viewSize,viewZero,viewStride); } /**
/** * Sets all cells to the state specified by <tt>values</tt>. * <tt>values</tt> is required to have the form <tt>values[row][column]</tt> * and have exactly the same number of rows and columns as the receiver. * <p> * The values are copied. So subsequent changes in <tt>values</tt> are not reflected in the matrix, and vice-versa. * * @param values the values to be filled into the cells. * @return <tt>this</tt> (for convenience only). * @throws IllegalArgumentException if <tt>values.length != rows() || for any 0 <= row < rows(): values[row].length != columns()</tt>. */ public ObjectMatrix2D assign(Object[][] values) { if (this.isNoView) { if (values.length != rows) throw new IllegalArgumentException("Must have same number of rows: rows="+values.length+"rows()="+rows()); int i = columns*(rows-1); for (int row=rows; --row >= 0;) { Object[] currentRow = values[row]; if (currentRow.length != columns) throw new IllegalArgumentException("Must have same number of columns in every row: columns="+currentRow.length+"columns()="+columns()); System.arraycopy(currentRow, 0, this.elements, i, columns); i -= columns; } } else { super.assign(values); } return this; } /**
/** Constructs a diagonal block matrix from the given parts (the <i>direct sum</i> of two matrices). That is the concatenation <pre> A 0 0 B </pre> (The direct sum has <tt>A.rows()+B.rows()</tt> rows and <tt>A.columns()+B.columns()</tt> columns). Cells are copied. @return a new matrix which is the direct sum. */ public ObjectMatrix2D composeDiagonal(ObjectMatrix2D A, ObjectMatrix2D B) { int ar = A.rows(); int ac = A.columns(); int br = B.rows(); int bc = B.columns(); ObjectMatrix2D sum = make(ar+br, ac+bc); sum.viewPart(0,0,ar,ac).assign(A); sum.viewPart(ar,ac,br,bc).assign(B); return sum; } /**
/** * Sets all cells to the state specified by <tt>values</tt>. * <tt>values</tt> is required to have the form <tt>values[row][column]</tt> * and have exactly the same number of rows and columns as the receiver. * <p> * The values are copied. So subsequent changes in <tt>values</tt> are not reflected in the matrix, and vice-versa. * * @param values the values to be filled into the cells. * @return <tt>this</tt> (for convenience only). * @throws IllegalArgumentException if <tt>values.length != rows() || for any 0 <= row < rows(): values[row].length != columns()</tt>. */ public ObjectMatrix2D assign(Object[][] values) { if (this.isNoView) { if (values.length != rows) throw new IllegalArgumentException("Must have same number of rows: rows="+values.length+"rows()="+rows()); int i = columns*(rows-1); for (int row=rows; --row >= 0;) { Object[] currentRow = values[row]; if (currentRow.length != columns) throw new IllegalArgumentException("Must have same number of columns in every row: columns="+currentRow.length+"columns()="+columns()); System.arraycopy(currentRow, 0, this.elements, i, columns); i -= columns; } } else { super.assign(values); } return this; } /**
/** Constructs a diagonal block matrix from the given parts (the <i>direct sum</i> of two matrices). That is the concatenation <pre> A 0 0 B </pre> (The direct sum has <tt>A.rows()+B.rows()</tt> rows and <tt>A.columns()+B.columns()</tt> columns). Cells are copied. @return a new matrix which is the direct sum. */ public ObjectMatrix2D composeDiagonal(ObjectMatrix2D A, ObjectMatrix2D B) { int ar = A.rows(); int ac = A.columns(); int br = B.rows(); int bc = B.columns(); ObjectMatrix2D sum = make(ar+br, ac+bc); sum.viewPart(0,0,ar,ac).assign(A); sum.viewPart(ar,ac,br,bc).assign(B); return sum; } /**