/*
 * Copyright (C) 2008-2015 by Holger Arndt
 *
 * This file is part of the Universal Java Matrix Package (UJMP).
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership and licensing.
 *
 * UJMP is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * UJMP 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with UJMP; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA  02110-1301  USA
 */

package org.ujmp.core.intmatrix.impl;

import org.ujmp.core.Coordinates;
import org.ujmp.core.intmatrix.IntMatrix;
import org.ujmp.core.intmatrix.stub.AbstractDenseIntMatrix2D;

public class ArrayDenseIntMatrix2D extends AbstractDenseIntMatrix2D {
	private static final long serialVersionUID = -3331102463077119410L;

	private final int[][] values;

	public ArrayDenseIntMatrix2D(int[]... v) {
		super(v.length, v[0].length);
		this.values = v;
	}

	public ArrayDenseIntMatrix2D(int rows, int columns) {
		super(rows, columns);
		values = new int[rows][columns];
	}

	public int getInt(long row, long column) {
		return values[(int) row][(int) column];
	}

	public void setInt(int value, long row, long column) {
		values[(int) row][(int) column] = value;
	}

	public int getInt(int row, int column) {
		return values[row][column];
	}

	public void setInt(int value, int row, int column) {
		values[row][column] = value;
	}

	public final IntMatrix transpose() {
		int[][] result = new int[values[0].length][values.length];
		for (int r = result.length; --r >= 0;) {
			for (int c = result[0].length; --c >= 0;) {
				result[r][c] = values[c][r];
			}
		}
		return new ArrayDenseIntMatrix2D(result);
	}

	public final IntMatrix plus(double v) {
		int vInt = (int) v;
		int[][] result = new int[values.length][values[0].length];
		for (int r = result.length; --r >= 0;) {
			for (int c = result[0].length; --c >= 0;) {
				result[r][c] = values[r][c] + vInt;
			}
		}
		return new ArrayDenseIntMatrix2D(result);
	}

	public final IntMatrix minus(double v) {
		int vInt = (int) v;
		int[][] result = new int[values.length][values[0].length];
		for (int r = result.length; --r >= 0;) {
			for (int c = result[0].length; --c >= 0;) {
				result[r][c] = values[r][c] - vInt;
			}
		}
		return new ArrayDenseIntMatrix2D(result);
	}

	public final IntMatrix times(double v) {
		int vInt = (int) v;
		int[][] result = new int[values.length][values[0].length];
		for (int r = result.length; --r >= 0;) {
			for (int c = result[0].length; --c >= 0;) {
				result[r][c] = values[r][c] * vInt;
			}
		}
		return new ArrayDenseIntMatrix2D(result);
	}

	public final IntMatrix divide(double v) {
		int vInt = (int) v;
		int[][] result = new int[values.length][values[0].length];
		for (int r = result.length; --r >= 0;) {
			for (int c = result[0].length; --c >= 0;) {
				result[r][c] = values[r][c] / vInt;
			}
		}
		return new ArrayDenseIntMatrix2D(result);
	}

	public final IntMatrix plus(IntMatrix m2) {
		int[][] result = new int[values.length][values[0].length];
		for (int r = result.length; --r >= 0;) {
			for (int c = result[0].length; --c >= 0;) {
				result[r][c] = values[r][c] + m2.getAsInt(r, c);
			}
		}
		return new ArrayDenseIntMatrix2D(result);
	}

	public final IntMatrix minus(IntMatrix m2) {
		int[][] result = new int[values.length][values[0].length];
		for (int r = result.length; --r >= 0;) {
			for (int c = result[0].length; --c >= 0;) {
				result[r][c] = values[r][c] - m2.getAsInt(r, c);
			}
		}
		return new ArrayDenseIntMatrix2D(result);
	}

	public final IntMatrix times(IntMatrix m2) {
		int[][] result = new int[values.length][values[0].length];
		for (int r = result.length; --r >= 0;) {
			for (int c = result[0].length; --c >= 0;) {
				result[r][c] = values[r][c] * m2.getAsInt(r, c);
			}
		}
		return new ArrayDenseIntMatrix2D(result);
	}

	public final IntMatrix divide(IntMatrix m2) {
		int[][] result = new int[values.length][values[0].length];
		for (int r = result.length; --r >= 0;) {
			for (int c = result[0].length; --c >= 0;) {
				result[r][c] = values[r][c] / m2.getAsInt(r, c);
			}
		}
		return new ArrayDenseIntMatrix2D(result);
	}

	public IntMatrix mtimes(IntMatrix matrix) {
		if (values[0].length != matrix.getRowCount()) {
			throw new RuntimeException("matrices have wrong size: "
					+ Coordinates.toString(getSize()) + " and "
					+ Coordinates.toString(matrix.getSize()));
		}

		int i, j, k;
		int sum;
		int[][] ret = new int[values.length][(int) matrix.getColumnCount()];

		for (i = values.length; --i >= 0;) {
			for (j = ret[0].length; --j >= 0;) {
				sum = 0;
				for (k = values[0].length; --k >= 0;) {
					sum += values[i][k] * matrix.getAsDouble(k, j);
				}
				ret[i][j] = sum;
			}
		}

		return new ArrayDenseIntMatrix2D(ret);
	}

	public boolean containsNaN() {
		for (int r = values.length; --r >= 0;) {
			for (int c = values[0].length; --c >= 0;) {
				if (Double.isNaN(values[r][c])) {
					return true;
				}
			}
		}
		return false;
	}

}

 

Ads help maintain this website.