?? 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 weka.core.matrix.DoubleVector;import weka.core.matrix.FlexibleDecimalFormat;import weka.core.matrix.IntVector;import weka.core.matrix.Matrix;import weka.core.matrix.Maths;import java.util.Random;import java.text.DecimalFormat;/** * 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: 1.3 $ */public class PaceMatrix extends Matrix { /** for serialization */ static final long serialVersionUID = 2699925616857843973L; /* ------------------------ 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. @throws 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. @throws 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. * * @return the clone */ 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. * @throws 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 column 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 * @return 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 * @return the result of the multiplication */ 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 * @return the decimal format */ protected DecimalFormat [] format( int digits ) { return format(0, m-1, 0, n-1, digits, false); } /** Decimal format for converting a matrix into a string * @param digits the number of digits * @param trailing * @return the decimal format */ 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 * @param digits the number of digits * @param i0 * @param i1 * @param j * @param digits * @param trailing * @return the decimal format */ 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 * @param digits the number of digits * @param i0 * @param i1 * @param j * @param trailing * @param digits * @return the decimal format */ 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ù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -