    001/* ===========================================================
    002 * JFreeChart : a free chart library for the Java(tm) platform
    003 * ===========================================================
    004 *
    005 * (C) Copyright 2000-2011, by Object Refinery Limited and Contributors.
    006 *
    007 * Project Info:  http://www.jfree.org/jfreechart/index.html
    008 *
    009 * This library is free software; you can redistribute it and/or modify it
    010 * under the terms of the GNU Lesser General Public License as published by
    011 * the Free Software Foundation; either version 2.1 of the License, or
    012 * (at your option) any later version.
    013 *
    014 * This library is distributed in the hope that it will be useful, but
    015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
    017 * License for more details.
    018 *
    019 * You should have received a copy of the GNU Lesser General Public
    020 * License along with this library; if not, write to the Free Software
    021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
    022 * USA.
    023 *
    024 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
    025 * Other names may be trademarks of their respective owners.]
    026 *
    027 * -----------------
    028 * MatrixSeries.java
    029 * -----------------
    030 * (C) Copyright 2003-2008, by Barak Naveh and Contributors.
    031 *
    032 * Original Author:  Barak Naveh;
    033 * Contributor(s):   David Gilbert (for Object Refinery Limited);
    034 *                   Zhitao Wang;
    035 *
    036 * Changes
    037 * -------
    038 * 10-Jul-2003 : Version 1 contributed by Barak Naveh (DG);
    039 * 10-Feb-2004 : Fixed Checkstyle complaints (DG);
    040 * 21-May-2004 : Fixed bug 940188 - problem in getItemColumn() and
    041 *               getItemRow() (DG);
    042 * ------------- JFREECHART 1.0.x ---------------------------------------------
    043 * 27-Nov-2006 : Fixed bug in equals() method (DG);
    044 * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
    045 *
    046 */
    047
    048package org.jfree.data.xy;
    049
    050import java.io.Serializable;
    051
    052import org.jfree.data.general.Series;
    053
    054/**
    055 * Represents a dense matrix M[i,j] where each Mij item of the matrix has a
    056 * value (default is 0).
    057 */
    058public class MatrixSeries extends Series implements Serializable {
    059
    060    /** For serialization. */
    061    private static final long serialVersionUID = 7934188527308315704L;
    062
    063    /** Series matrix values */
    064    protected double[][] data;
    065
    066    /**
    067     * Constructs a new matrix series.
    068     * <p>
    069     * By default, all matrix items are initialzed to 0.
    070     * </p>
    071     *
    072     * @param name  series name (<code>null</code> not permitted).
    073     * @param rows  the number of rows.
    074     * @param columns  the number of columns.
    075     */
    076    public MatrixSeries(String name, int rows, int columns) {
    077        super(name);
    078        this.data = new double[rows][columns];
    079        zeroAll();
    080    }
    081
    082    /**
    083     * Returns the number of columns in this matrix series.
    084     *
    085     * @return The number of columns in this matrix series.
    086     */
    087    public int getColumnsCount() {
    088        return this.data[0].length;
    089    }
    090
    091
    092    /**
    093     * Return the matrix item at the specified index.  Note that this method
    094     * creates a new <code>Double</code> instance every time it is called.
    095     *
    096     * @param itemIndex item index.
    097     *
    098     * @return The matrix item at the specified index.
    099     *
    100     * @see #get(int, int)
    101     */
    102    public Number getItem(int itemIndex) {
    103        int i = getItemRow(itemIndex);
    104        int j = getItemColumn(itemIndex);
    105
    106        Number n = new Double(get(i, j));
    107
    108        return n;
    109    }
    110
    111
    112    /**
    113     * Returns the column of the specified item.
    114     *
    115     * @param itemIndex the index of the item.
    116     *
    117     * @return The column of the specified item.
    118     */
    119    public int getItemColumn(int itemIndex) {
    120        //assert itemIndex >= 0 && itemIndex < getItemCount();
    121        return itemIndex % getColumnsCount();
    122    }
    123
    124
    125    /**
    126     * Returns the number of items in the series.
    127     *
    128     * @return The item count.
    129     */
    130    public int getItemCount() {
    131        return getRowCount() * getColumnsCount();
    132    }
    133
    134
    135    /**
    136     * Returns the row of the specified item.
    137     *
    138     * @param itemIndex the index of the item.
    139     *
    140     * @return The row of the specified item.
    141     */
    142    public int getItemRow(int itemIndex) {
    143        //assert itemIndex >= 0 && itemIndex < getItemCount();
    144        return itemIndex / getColumnsCount();
    145    }
    146
    147
    148    /**
    149     * Returns the number of rows in this matrix series.
    150     *
    151     * @return The number of rows in this matrix series.
    152     */
    153    public int getRowCount() {
    154        return this.data.length;
    155    }
    156
    157
    158    /**
    159     * Returns the value of the specified item in this matrix series.
    160     *
    161     * @param i the row of the item.
    162     * @param j the column of the item.
    163     *
    164     * @return The value of the specified item in this matrix series.
    165     *
    166     * @see #getItem(int)
    167     * @see #update(int, int, double)
    168     */
    169    public double get(int i, int j) {
    170        return this.data[i][j];
    171    }
    172
    173
    174    /**
    175     * Updates the value of the specified item in this matrix series.
    176     *
    177     * @param i the row of the item.
    178     * @param j the column of the item.
    179     * @param mij the new value for the item.
    180     *
    181     * @see #get(int, int)
    182     */
    183    public void update(int i, int j, double mij) {
    184        this.data[i][j] = mij;
    185        fireSeriesChanged();
    186    }
    187
    188
    189    /**
    190     * Sets all matrix values to zero and sends a
    191     * {@link org.jfree.data.general.SeriesChangeEvent} to all registered
    192     * listeners.
    193     */
    194    public void zeroAll() {
    195        int rows = getRowCount();
    196        int columns = getColumnsCount();
    197
    198        for (int row = 0; row < rows; row++) {
    199            for (int column = 0; column < columns; column++) {
    200                this.data[row][column] = 0.0;
    201            }
    202        }
    203        fireSeriesChanged();
    204    }
    205
    206    /**
    207     * Tests this object instance for equality with an arbitrary object.
    208     *
    209     * @param obj  the object (<code>null</code> permitted).
    210     *
    211     * @return A boolean.
    212     */
    213    public boolean equals(Object obj) {
    214        if (obj == this) {
    215            return true;
    216        }
    217        if (!(obj instanceof MatrixSeries)) {
    218            return false;
    219        }
    220        MatrixSeries that = (MatrixSeries) obj;
    221        if (!(getRowCount() == that.getRowCount())) {
    222            return false;
    223        }
    224        if (!(getColumnsCount() == that.getColumnsCount())) {
    225            return false;
    226        }
    227        for (int r = 0; r < getRowCount(); r++) {
    228            for (int c = 0; c < getColumnsCount(); c++) {
    229                if (get(r, c) != that.get(r, c)) {
    230                    return false;
    231                }
    232            }
    233        }
    234        return super.equals(obj);
    235    }
    236
    237}