📄 pacematrix.java
字号:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/*
* PaceMatrix.java
* Copyright (C) 2002 Yong Wang
*
*/
package weka.classifiers.functions.pace;
import java.text.DecimalFormat;
import java.util.Random;
/**
* Class for matrix manipulation used for pace regression. <p>
*
* REFERENCES <p>
*
* Wang, Y. (2000). "A new approach to fitting linear models in high
* dimensional spaces." PhD Thesis. Department of Computer Science,
* University of Waikato, New Zealand. <p>
*
* Wang, Y. and Witten, I. H. (2002). "Modeling for optimal probability
* prediction." Proceedings of ICML'2002. Sydney. <p>
*
* @author Yong Wang (yongwang@cs.waikato.ac.nz)
* @version $Revision$ */
public class PaceMatrix extends Matrix {
/* ------------------------
Constructors
* ------------------------ */
/** Construct an m-by-n PACE matrix of zeros.
@param m Number of rows.
@param n Number of colums.
*/
public PaceMatrix( int m, int n ) {
super( m, n );
}
/** Construct an m-by-n constant PACE matrix.
@param m Number of rows.
@param n Number of colums.
@param s Fill the matrix with this scalar value.
*/
public PaceMatrix( int m, int n, double s ) {
super( m, n, s );
}
/** Construct a PACE matrix from a 2-D array.
@param A Two-dimensional array of doubles.
@exception IllegalArgumentException All rows must have the same length
*/
public PaceMatrix( double[][] A ) {
super( A );
}
/** Construct a PACE matrix quickly without checking arguments.
@param A Two-dimensional array of doubles.
@param m Number of rows.
@param n Number of colums.
*/
public PaceMatrix( double[][] A, int m, int n ) {
super( A, m, n );
}
/** Construct a PaceMatrix from a one-dimensional packed array
@param vals One-dimensional array of doubles, packed by columns (ala Fortran).
@param m Number of rows.
@exception IllegalArgumentException Array length must be a multiple of m.
*/
public PaceMatrix( double vals[], int m ) {
super( vals, m );
}
/** Construct a PaceMatrix with a single column from a DoubleVector
@param v DoubleVector
*/
public PaceMatrix( DoubleVector v ) {
this( v.size(), 1 );
setMatrix( 0, v.size()-1, 0, v );
}
/** Construct a PaceMatrix from a Matrix
@param X Matrix
*/
public PaceMatrix( Matrix X ) {
super( X.getRowDimension(), X.getColumnDimension() );
A = X.getArray();
}
/* ------------------------
Public Methods
* ------------------------ */
/** Set the row dimenion of the matrix
* @param rowDimension the row dimension
*/
public void setRowDimension( int rowDimension )
{
m = rowDimension;
}
/** Set the column dimenion of the matrix
* @param columnDimension the column dimension
*/
public void setColumnDimension( int columnDimension )
{
n = columnDimension;
}
/** Clone the PaceMatrix object.
*/
public Object clone () {
PaceMatrix X = new PaceMatrix(m,n);
double[][] C = X.getArray();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
C[i][j] = A[i][j];
}
}
return (Object) X;
}
/** Add a value to an element and reset the element
* @param i the row number of the element
* @param j the column number of the element
* @param s the double value to be added with
*/
public void setPlus(int i, int j, double s) {
A[i][j] += s;
}
/** Multiply a value with an element and reset the element
* @param i the row number of the element
* @param j the column number of the element
* @param s the double value to be multiplied with
*/
public void setTimes(int i, int j, double s) {
A[i][j] *= s;
}
/** Set the submatrix A[i0:i1][j0:j1] with a same value
* @param i0 the index of the first element of the column
* @param i1 the index of the last element of the column
* @param j0 the index of the first column
* @param j1 the index of the last column
* @param s the value to be set to
*/
public void setMatrix( int i0, int i1, int j0, int j1, double s ) {
try {
for( int i = i0; i <= i1; i++ ) {
for( int j = j0; j <= j1; j++ ) {
A[i][j] = s;
}
}
} catch( ArrayIndexOutOfBoundsException e ) {
throw new ArrayIndexOutOfBoundsException( "Index out of bounds" );
}
}
/** Set the submatrix A[i0:i1][j] with the values stored in a
* DoubleVector
* @param i0 the index of the first element of the column
* @param i1 the index of the last element of the column
* @param j the index of the column
* @param v the vector that stores the values*/
public void setMatrix( int i0, int i1, int j, DoubleVector v ) {
for( int i = i0; i <= i1; i++ ) {
A[i][j] = v.get(i-i0);
}
}
/** Set the whole matrix from a 1-D array
* @param v 1-D array of doubles
* @param columnFirst Whether to fill the column first or the row.
* @exception ArrayIndexOutOfBoundsException Submatrix indices
*/
public void setMatrix ( double[] v, boolean columnFirst ) {
try {
if( v.length != m * n )
throw new IllegalArgumentException("sizes not match.");
int i, j, count = 0;
if( columnFirst ) {
for( i = 0; i < m; i++ ) {
for( j = 0; j < n; j++ ) {
A[i][j] = v[count];
count ++;
}
}
}
else {
for( j = 0; j < n; j++ ) {
for( i = 0; i < m; i++ ){
A[i][j] = v[count];
count ++;
}
}
}
} catch( ArrayIndexOutOfBoundsException e ) {
throw new ArrayIndexOutOfBoundsException( "Submatrix indices" );
}
}
/** Returns the maximum absolute value of all elements
@return the maximum value
*/
public double maxAbs () {
double ma = Math.abs(A[0][0]);
for (int j = 0; j < n; j++) {
for (int i = 0; i < m; i++) {
ma = Math.max(ma, Math.abs(A[i][j]));
}
}
return ma;
}
/** Returns the maximum absolute value of some elements of a column,
that is, the elements of A[i0:i1][j].
@param i0 the index of the first element of the column
@param i1 the index of the last element of the column
@param j the index of the column
@return the maximum value */
public double maxAbs ( int i0, int i1, int j ) {
double m = Math.abs(A[i0][j]);
for (int i = i0+1; i <= i1; i++) {
m = Math.max(m, Math.abs(A[i][j]));
}
return m;
}
/** Returns the minimum absolute value of some elements of a column,
that is, the elements of A[i0:i1][j].
@param i0 the index of the first element of the column
@param i1 the index of the last element of the column
@param j the index of the column
@return the minimum value
*/
public double minAbs ( int i0, int i1, int column ) {
double m = Math.abs(A[i0][column]);
for (int i = i0+1; i <= i1; i++) {
m = Math.min(m, Math.abs(A[i][column]));
}
return m;
}
/** Check if the matrix is empty
* @return true if the matrix is empty
*/
public boolean isEmpty(){
if(m == 0 || n == 0) return true;
if(A == null) return true;
return false;
}
/** Return a DoubleVector that stores a column of the matrix
* @param j the index of the column
*/
public DoubleVector getColumn( int j ) {
DoubleVector v = new DoubleVector( m );
double [] a = v.getArray();
for(int i = 0; i < m; i++)
a[i] = A[i][j];
return v;
}
/** Return a DoubleVector that stores some elements of a column of the
* matrix
* @param i0 the index of the first element of the column
* @param i1 the index of the last element of the column
* @param j the index of the column
* @return the DoubleVector
*/
public DoubleVector getColumn( int i0, int i1, int j ) {
DoubleVector v = new DoubleVector( i1-i0+1 );
double [] a = v.getArray();
int count = 0;
for( int i = i0; i <= i1; i++ ) {
a[count] = A[i][j];
count++;
}
return v;
}
/** Multiplication between a row (or part of a row) of the first matrix
* and a column (or part or a column) of the second matrix.
* @param i the index of the row in the first matrix
* @param j0 the index of the first column in the first matrix
* @param j1 the index of the last column in the first matrix
* @param B the second matrix
* @param l the index of the column in the second matrix
*/
public double times( int i, int j0, int j1, PaceMatrix B, int l ) {
double s = 0.0;
for(int j = j0; j <= j1; j++ ) {
s += A[i][j] * B.A[j][l];
}
return s;
}
/** Decimal format for converting a matrix into a string
* @return the default decimal format
*/
protected DecimalFormat [] format() {
return format(0, m-1, 0, n-1, 7, false );
}
/** Decimal format for converting a matrix into a string
* @param digits the number of digits
*/
protected DecimalFormat [] format( int digits ) {
return format(0, m-1, 0, n-1, digits, false);
}
/** Decimal format for converting a matrix into a string
*/
protected DecimalFormat [] format( int digits, boolean trailing ) {
return format(0, m-1, 0, n-1, digits, trailing);
}
/** Decimal format for converting a matrix into a string
*/
protected DecimalFormat format(int i0, int i1, int j, int digits,
boolean trailing) {
FlexibleDecimalFormat df = new FlexibleDecimalFormat(digits, trailing);
df.grouping( true );
for(int i = i0; i <= i1; i ++ )
df.update( A[i][j] );
return df;
}
/** Decimal format for converting a matrix into a string
*/
protected DecimalFormat [] format(int i0, int i1, int j0, int j1,
int digits, boolean trailing) {
DecimalFormat [] f = new DecimalFormat[j1-j0+1];
for( int j = j0; j <= j1; j++ ) {
f[j] = format(i0, i1, j, digits, trailing);
}
return f;
}
/** Converts matrix to string
*/
public String toString() {
return toString( 5, false );
}
/** Converts matrix to string
* @param digits number of digits after decimal point
* @param trailing true if trailing zeros are padded
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -