/*
 * 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.matrix.factory;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.SocketException;
import java.sql.Connection;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.ZipException;

import org.ujmp.core.DenseMatrix;
import org.ujmp.core.Matrix;
import org.ujmp.core.bigintegermatrix.BigIntegerMatrix;
import org.ujmp.core.bigintegermatrix.DenseBigIntegerMatrix2D;
import org.ujmp.core.bigintegermatrix.calculation.Fibonacci;
import org.ujmp.core.booleanmatrix.DenseBooleanMatrix2D;
import org.ujmp.core.booleanmatrix.impl.ArrayDenseBooleanMatrix2D;
import org.ujmp.core.bytematrix.DenseByteMatrix2D;
import org.ujmp.core.bytematrix.impl.ArrayDenseByteMatrix2D;
import org.ujmp.core.calculation.Calculation.Ret;
import org.ujmp.core.charmatrix.DenseCharMatrix2D;
import org.ujmp.core.charmatrix.impl.ArrayDenseCharMatrix2D;
import org.ujmp.core.doublematrix.DenseDoubleMatrix;
import org.ujmp.core.doublematrix.DenseDoubleMatrix2D;
import org.ujmp.core.doublematrix.calculation.entrywise.creators.Pascal;
import org.ujmp.core.doublematrix.calculation.entrywise.creators.Range;
import org.ujmp.core.doublematrix.impl.ArrayDenseDoubleMatrix2D;
import org.ujmp.core.doublematrix.impl.DenseFileMatrix;
import org.ujmp.core.enums.DBType;
import org.ujmp.core.filematrix.FileMatrix;
import org.ujmp.core.filematrix.ZipFileMatrix;
import org.ujmp.core.floatmatrix.DenseFloatMatrix2D;
import org.ujmp.core.floatmatrix.impl.ArrayDenseFloatMatrix2D;
import org.ujmp.core.genericmatrix.GenericMatrix;
import org.ujmp.core.importer.sourceselector.DefaultMatrixImportSourceSelector;
import org.ujmp.core.importer.sourceselector.MatrixImportSourceSelector;
import org.ujmp.core.intmatrix.DenseIntMatrix2D;
import org.ujmp.core.intmatrix.calculation.Magic;
import org.ujmp.core.intmatrix.impl.ArrayDenseIntMatrix2D;
import org.ujmp.core.intmatrix.impl.ImageMatrix;
import org.ujmp.core.io.ImportMatrixJDBC;
import org.ujmp.core.io.LinkMatrixJDBC;
import org.ujmp.core.link.sourceselector.DefaultMatrixLinkSourceSelector;
import org.ujmp.core.link.sourceselector.MatrixLinkSourceSelector;
import org.ujmp.core.listmatrix.DefaultListMatrix;
import org.ujmp.core.listmatrix.ListMatrix;
import org.ujmp.core.longmatrix.DenseLongMatrix2D;
import org.ujmp.core.longmatrix.impl.ArrayDenseLongMatrix2D;
import org.ujmp.core.mapmatrix.DefaultMapMatrix;
import org.ujmp.core.mapmatrix.MapMatrix;
import org.ujmp.core.objectmatrix.DenseObjectMatrix2D;
import org.ujmp.core.objectmatrix.ObjectMatrix;
import org.ujmp.core.objectmatrix.ObjectMatrix2D;
import org.ujmp.core.objectmatrix.calculation.Concatenation;
import org.ujmp.core.objectmatrix.calculation.Convert;
import org.ujmp.core.objectmatrix.calculation.Repmat;
import org.ujmp.core.objectmatrix.calculation.WelcomeMatrix;
import org.ujmp.core.objectmatrix.impl.ArrayDenseObjectMatrix2D;
import org.ujmp.core.objectmatrix.impl.EmptyMatrix;
import org.ujmp.core.objectmatrix.impl.SynchronizedGenericMatrix;
import org.ujmp.core.setmatrix.DefaultSetMatrix;
import org.ujmp.core.setmatrix.SetMatrix;
import org.ujmp.core.shortmatrix.DenseShortMatrix2D;
import org.ujmp.core.shortmatrix.impl.ArrayDenseShortMatrix2D;
import org.ujmp.core.stringmatrix.DenseStringMatrix2D;
import org.ujmp.core.stringmatrix.impl.ArrayDenseStringMatrix2D;
import org.ujmp.core.util.MathUtil;
import org.ujmp.core.util.matrices.AvailableProcessorsMatrix;
import org.ujmp.core.util.matrices.IrisMatrix;
import org.ujmp.core.util.matrices.LocalhostMatrix;
import org.ujmp.core.util.matrices.MatrixLibraries;
import org.ujmp.core.util.matrices.MemoryUsageMatrix;
import org.ujmp.core.util.matrices.OperatingSystemMatrix;
import org.ujmp.core.util.matrices.RandomSeedMatrix;
import org.ujmp.core.util.matrices.RunningThreadsMatrix;
import org.ujmp.core.util.matrices.SystemEnvironmentMatrix;
import org.ujmp.core.util.matrices.SystemPropertiesMatrix;
import org.ujmp.core.util.matrices.SystemTimeMatrix;

public abstract class AbstractMatrixFactory implements BaseMatrixFactory {

	public static final EmptyMatrix EMPTYMATRIX = new EmptyMatrix();

	public final IrisMatrix irisMatrix() {
		return new IrisMatrix();
	}

	public DenseMatrix createFromScreenshot() throws HeadlessException, AWTException {
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		final BufferedImage image = new Robot().createScreenCapture(new Rectangle(screenSize));
		return linkToImage(image);
	}

	public MatrixLibraries matrixLibraries() {
		return new MatrixLibraries();
	}

	public DenseMatrix linkToImage(BufferedImage image) {
		return new ImageMatrix(image);
	}

	public ImageMatrix linkToImage(File file) throws IOException {
		return new ImageMatrix(file);
	}

	public Matrix linkToJDBC(File file) {
		return LinkMatrixJDBC.toDatabase(file);
	}

	public ZipFileMatrix linkToZipFile(File file) throws ZipException, IOException {
		return new ZipFileMatrix(file);
	}

	public final DenseBooleanMatrix2D linkToArray(boolean... values) {
		return new ArrayDenseBooleanMatrix2D(values);
	}

	public final DenseByteMatrix2D linkToArray(byte[]... values) {
		return new ArrayDenseByteMatrix2D(values);
	}

	public final DenseByteMatrix2D linkToArray(byte... values) {
		return new ArrayDenseByteMatrix2D(values);
	}

	public final DenseCharMatrix2D linkToArray(char[]... values) {
		return new ArrayDenseCharMatrix2D(values);
	}

	public final DenseCharMatrix2D linkToArray(char... values) {
		return new ArrayDenseCharMatrix2D(values);
	}

	public final DenseDoubleMatrix2D linkToArray(double[]... values) {
		return new ArrayDenseDoubleMatrix2D(values);
	}

	public final DenseDoubleMatrix2D linkToArray(double... values) {
		return new ArrayDenseDoubleMatrix2D(values);
	}

	public final DenseFloatMatrix2D linkToArray(float[]... values) {
		return new ArrayDenseFloatMatrix2D(values);
	}

	public final DenseFloatMatrix2D linkToArray(float... values) {
		return new ArrayDenseFloatMatrix2D(values);
	}

	public final DenseIntMatrix2D linkToArray(int[]... values) {
		return new ArrayDenseIntMatrix2D(values);
	}

	public final DenseIntMatrix2D linkToArray(int... values) {
		return new ArrayDenseIntMatrix2D(values);
	}

	public final DenseLongMatrix2D linkToArray(long[]... values) {
		return new ArrayDenseLongMatrix2D(values);
	}

	public final DenseLongMatrix2D linkToArray(long... values) {
		return new ArrayDenseLongMatrix2D(values);
	}

	public final DenseObjectMatrix2D linkToArray(Object[]... values) {
		return new ArrayDenseObjectMatrix2D(values);
	}

	public final DenseObjectMatrix2D linkToArray(Object... values) {
		return new ArrayDenseObjectMatrix2D(values);
	}

	public final DenseShortMatrix2D linkToArray(short[]... values) {
		return new ArrayDenseShortMatrix2D(values);
	}

	public final DenseShortMatrix2D linkToArray(short... values) {
		return new ArrayDenseShortMatrix2D(values);
	}

	public final DenseStringMatrix2D linkToArray(String[]... values) {
		return new ArrayDenseStringMatrix2D(values);
	}

	public final DenseStringMatrix2D linkToArray(String... values) {
		return new ArrayDenseStringMatrix2D(values);
	}

	// Wolfer's sunspot data 1700 - 1987
	public final DenseDoubleMatrix2D sunSpotDataset() {
		return linkToArray(new double[] { 5, 11, 16, 23, 36, 58, 29, 20, 10, 8, 3, 0, 0, 2, 11, 27,
				47, 63, 60, 39, 28, 26, 22, 11, 21, 40, 78, 122, 103, 73, 47, 35, 11, 5, 16, 34,
				70, 81, 111, 101, 73, 40, 20, 16, 5, 11, 22, 40, 60, 80.9, 83.4, 47.7, 47.8, 30.7,
				12.2, 9.6, 10.2, 32.4, 47.6, 54, 62.9, 85.9, 61.2, 45.1, 36.4, 20.9, 11.4, 37.8,
				69.8, 106.1, 100.8, 81.6, 66.5, 34.8, 30.6, 7, 19.8, 92.5, 154.4, 125.9, 84.8,
				68.1, 38.5, 22.8, 10.2, 24.1, 82.9, 132, 130.9, 118.1, 89.9, 66.6, 60, 46.9, 41,
				21.3, 16, 6.4, 4.1, 6.8, 14.5, 34, 45, 43.1, 47.5, 42.2, 28.1, 10.1, 8.1, 2.5, 0,
				1.4, 5, 12.2, 13.9, 35.4, 45.8, 41.1, 30.1, 23.9, 15.6, 6.6, 4, 1.8, 8.5, 16.6,
				36.3, 49.6, 64.2, 67, 70.9, 47.8, 27.5, 8.5, 13.2, 56.9, 121.5, 138.3, 103.2, 85.7,
				64.6, 36.7, 24.2, 10.7, 15, 40.1, 61.5, 98.5, 124.7, 96.3, 66.6, 64.5, 54.1, 39,
				20.6, 6.7, 4.3, 22.7, 54.8, 93.8, 95.8, 77.2, 59.1, 44, 47, 30.5, 16.3, 7.3, 37.6,
				74, 139, 111.2, 101.6, 66.2, 44.7, 17, 11.3, 12.4, 3.4, 6, 32.3, 54.3, 59.7, 63.7,
				63.5, 52.2, 25.4, 13.1, 6.8, 6.3, 7.1, 35.6, 73, 85.1, 78, 64, 41.8, 26.2, 26.7,
				12.1, 9.5, 2.7, 5, 24.4, 42, 63.5, 53.8, 62, 48.5, 43.9, 18.6, 5.7, 3.6, 1.4, 9.6,
				47.4, 57.1, 103.9, 80.6, 63.6, 37.6, 26.1, 14.2, 5.8, 16.7, 44.3, 63.9, 69, 77.8,
				64.9, 35.7, 21.2, 11.1, 5.7, 8.7, 36.1, 79.7, 114.4, 109.6, 88.8, 67.8, 47.5, 30.6,
				16.3, 9.6, 33.2, 92.6, 151.6, 136.3, 134.7, 83.9, 69.4, 31.5, 13.9, 4.4, 38, 141.7,
				190.2, 184.8, 159, 112.3, 53.9, 37.5, 27.9, 10.2, 15.1, 47, 93.8, 105.9, 105.5,
				104.5, 66.6, 68.9, 38, 34.5, 15.5, 12.6, 27.5, 92.5, 155.4, 154.6, 140.4, 115.9,
				66.6, 45.9, 17.9, 13.4, 29.3 });
	}

	public final LocalhostMatrix localhostMatrix() throws SocketException {
		return LocalhostMatrix.getInstance();
	}

	public final MatrixImportSourceSelector importFrom() {
		return new DefaultMatrixImportSourceSelector();
	}

	public final MatrixLinkSourceSelector linkTo() {
		return new DefaultMatrixLinkSourceSelector();
	}

	public final Matrix copyFromMatrix(Matrix matrix) {
		return Convert.calcNew(matrix);
	}

	public final DenseBooleanMatrix2D importFromArray(final boolean[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseByteMatrix2D importFromArray(final byte[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseCharMatrix2D importFromArray(final char[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseDoubleMatrix2D importFromArray(final double[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseFloatMatrix2D importFromArray(final float[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseIntMatrix2D importFromArray(final int[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseLongMatrix2D importFromArray(final long[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseObjectMatrix2D importFromArray(final Object[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseShortMatrix2D importFromArray(final short[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseStringMatrix2D importFromArray(final String[]... values) {
		return linkToArray(values.clone());
	}

	public final DenseBooleanMatrix2D linkToArray(final boolean[]... values) {
		return new ArrayDenseBooleanMatrix2D(values);
	}

	public final DenseDoubleMatrix2D createVectorForClass(int classID, int classCount) {
		DenseDoubleMatrix2D matrix = DenseDoubleMatrix2D.Factory.zeros(classCount, 1);
		matrix.setAsDouble(1.0, classID, 0);
		return matrix;
	}

	public final FileMatrix linkToDir(String dir) throws IOException {
		return new FileMatrix(dir);
	}

	public final FileMatrix linkToDir(File dir) throws IOException {
		return new FileMatrix(dir);
	}

	public final  MapMatrix linkToMap(Map map) {
		if (map instanceof MapMatrix) {
			return (MapMatrix) map;
		} else {
			return new DefaultMapMatrix(map);
		}
	}

	public final  ListMatrix linkToCollection(Collection list) {
		if (list instanceof ListMatrix) {
			return (ListMatrix) list;
		} else {
			return new DefaultListMatrix(list);
		}
	}

	public final  ListMatrix linkToList(List list) {
		if (list instanceof ListMatrix) {
			return (ListMatrix) list;
		} else {
			return new DefaultListMatrix(list);
		}
	}

	public final  SetMatrix linkToSet(Set set) {
		if (set instanceof SetMatrix) {
			return (SetMatrix) set;
		} else {
			return new DefaultSetMatrix(set);
		}
	}

	/**
	 * Wraps another Matrix so that all methods are executed synchronized.
	 * 
	 * @param matrix
	 *            the source Matrix
	 * @return a synchronized Matrix
	 */
	public final  SynchronizedGenericMatrix synchronizedMatrix(GenericMatrix matrix) {
		return new SynchronizedGenericMatrix(matrix);
	}

	public final DenseDoubleMatrix linkToBinaryFile(String filename, long... size)
			throws IOException {
		return new DenseFileMatrix(new File(filename), size);
	}

	public final ObjectMatrix2D linkToJDBC(String url, String sqlStatement, String username,
			String password) {
		return LinkMatrixJDBC.toDatabase(url, sqlStatement, username, password);
	}

	public final ObjectMatrix2D linkToJDBC(Connection connection, String sqlStatement) {
		return LinkMatrixJDBC.toDatabase(connection, sqlStatement);
	}

	public final ObjectMatrix2D linkToJDBC(DBType type, String host, int port, String database,
			String sqlStatement, String username, String password) {
		return LinkMatrixJDBC.toDatabase(type, host, port, database, sqlStatement, username,
				password);
	}

	public final ObjectMatrix importFromJDBC(String url, String sqlStatement, String username,
			String password) {
		return ImportMatrixJDBC.fromDatabase(url, sqlStatement, username, password);
	}

	public final ObjectMatrix importFromJDBC(Connection connection, String sqlStatement) {
		return ImportMatrixJDBC.fromDatabase(connection, sqlStatement);
	}

	public final ObjectMatrix importFromJDBC(DBType type, String host, int port, String database,
			String sqlStatement, String username, String password) {
		return ImportMatrixJDBC.fromDatabase(type, host, port, database, sqlStatement, username,
				password);
	}

	public final DenseDoubleMatrix2D linkToValue(double value) {
		return new ArrayDenseDoubleMatrix2D(new double[][] { { value } });
	}

	public final DenseIntMatrix2D linkToValue(int value) {
		return new ArrayDenseIntMatrix2D(new int[][] { { value } });
	}

	public final DenseCharMatrix2D linkToValue(char value) {
		return new ArrayDenseCharMatrix2D(new char[][] { { value } });
	}

	public final DenseBooleanMatrix2D linkToValue(boolean value) {
		return new ArrayDenseBooleanMatrix2D(new boolean[][] { { value } });
	}

	public final DenseByteMatrix2D linkToValue(byte value) {
		return new ArrayDenseByteMatrix2D(new byte[][] { { value } });
	}

	public final DenseShortMatrix2D linkToValue(short value) {
		return new ArrayDenseShortMatrix2D(new short[][] { { value } });
	}

	public final DenseStringMatrix2D linkToValue(String value) {
		return new ArrayDenseStringMatrix2D(new String[][] { { value } });
	}

	public final DenseLongMatrix2D linkToValue(long value) {
		return new ArrayDenseLongMatrix2D(new long[][] { { value } });
	}

	public final DenseDoubleMatrix2D linkToValue(Double value) {
		return new ArrayDenseDoubleMatrix2D(new double[][] { { value } });
	}

	public final DenseIntMatrix2D linkToValue(Integer value) {
		return new ArrayDenseIntMatrix2D(new int[][] { { value } });
	}

	public final DenseFloatMatrix2D linkToValue(Float value) {
		return new ArrayDenseFloatMatrix2D(new float[][] { { value } });
	}

	public final DenseShortMatrix2D linkToValue(Short value) {
		return new ArrayDenseShortMatrix2D(new short[][] { { value } });
	}

	public final DenseByteMatrix2D linkToValue(Byte value) {
		return new ArrayDenseByteMatrix2D(new byte[][] { { value } });
	}

	public final DenseBooleanMatrix2D linkToValue(Boolean value) {
		return new ArrayDenseBooleanMatrix2D(new boolean[][] { { value } });
	}

	public final DenseLongMatrix2D linkToValue(Long value) {
		return new ArrayDenseLongMatrix2D(new long[][] { { value } });
	}

	public final DenseObjectMatrix2D linkToValue(Object value) {
		return new ArrayDenseObjectMatrix2D(new Object[][] { { value } });
	}

	public final EmptyMatrix emptyMatrix() {
		return EMPTYMATRIX;
	}

	public final Matrix repmat(Ret returnType, Matrix matrix, long... count) {
		return new Repmat(matrix, count).calc(returnType);
	}

	public final WelcomeMatrix welcomeMatrix() {
		return new WelcomeMatrix();
	}

	public final Matrix vertCat(Matrix row, long rowCount) {
		Matrix[] matrices = new Matrix[(int) rowCount];
		Arrays.fill(matrices, row);
		return vertCat(matrices);
	}

	public final Matrix horCat(Ret ret, Matrix column, long columnCount) {
		Matrix[] matrices = new Matrix[(int) columnCount];
		Arrays.fill(matrices, column);
		return horCat(ret, matrices);
	}

	public final Matrix horCat(Matrix column, long columnCount) {
		Matrix[] matrices = new Matrix[(int) columnCount];
		Arrays.fill(matrices, column);
		return horCat(matrices);
	}

	public final DenseDoubleMatrix2D sequence(double start, double end) {
		return sequence(start, end, 1);
	}

	public final DenseDoubleMatrix2D sequence(double start, double end, double stepsize) {
		return Matrix.Factory.linkToArray(MathUtil.sequenceDouble(start, end, stepsize));
	}

	public final RunningThreadsMatrix runningThreads() {
		return new RunningThreadsMatrix();
	}

	public final SystemEnvironmentMatrix systemEnvironment() {
		return new SystemEnvironmentMatrix();
	}

	public final SystemPropertiesMatrix systemProperties() {
		return new SystemPropertiesMatrix();
	}

	public final Matrix horCat(Matrix... matrices) {
		return concat(COLUMN, matrices);
	}

	public final Matrix horCat(Ret ret, Matrix... matrices) {
		return concat(ret, COLUMN, matrices);
	}

	public final Matrix horCat(Ret ret, Collection matrices) {
		return concat(ret, COLUMN, matrices);
	}

	public final  Matrix vertCat(Matrix... matrices) {
		return concat(ROW, matrices);
	}

	public final  Matrix vertCat(Collection matrices) {
		return concat(ROW, matrices);
	}

	public final  Matrix vertCat(Ret ret, Collection matrices) {
		return concat(ret, ROW, matrices);
	}

	public final Matrix horCat(Collection matrices) {
		return concat(COLUMN, matrices);
	}

	public final Matrix concat(int dimension, Matrix... matrices) {
		return concat(dimension, Arrays.asList(matrices));
	}

	public final Matrix concat(Ret ret, int dimension, Matrix... matrices) {
		return concat(ret, dimension, Arrays.asList(matrices));
	}

	public final Matrix concat(int dimension, Collection matrices) {
		return new Concatenation(dimension, matrices).calc(Ret.NEW);
	}

	public final Matrix concat(Ret ret, int dimension, Collection matrices) {
		return new Concatenation(dimension, matrices).calc(ret);
	}

	public final SystemTimeMatrix systemTime() {
		return new SystemTimeMatrix();
	}

	public final AvailableProcessorsMatrix availableProcessors() {
		return new AvailableProcessorsMatrix();
	}

	public final OperatingSystemMatrix operatingSystem() {
		return new OperatingSystemMatrix();
	}

	public final MemoryUsageMatrix memoryUsage() {
		return new MemoryUsageMatrix();
	}

	public final Matrix range(double start, double end, double stepSize) {
		return new Range(null, start, stepSize, end).calc(Ret.LINK);
	}

	public final Matrix range(double start, double end) {
		return range(start, 1.0, end);
	}

	public final RandomSeedMatrix randomSeed() {
		return new RandomSeedMatrix();
	}

	public final T fill(Object value, long... size) {
		T result = zeros(size);
		result.fill(Ret.ORIG, value);
		return result;
	}

	public final DenseIntMatrix2D magic(int size) {
		return Magic.magic(size);
	}

	public final Matrix pascal(long... size) {
		return new Pascal(DenseBigIntegerMatrix2D.Factory.zeros(size[ROW], size[COLUMN]))
				.calcOrig();
	}

	public final BigIntegerMatrix fibonacci(int count) {
		return new Fibonacci(count).calcNew();
	}

	public final T rand(final long... size) {
		final T m = zeros(size);
		m.rand(Ret.ORIG);
		return m;
	}

	public final T randn(final long... size) {
		final T m = zeros(size);
		m.randn(Ret.ORIG);
		return m;
	}

	public final T ones(final long... size) {
		final T m = zeros(size);
		m.ones(Ret.ORIG);
		return m;
	}

	public final T nans(final long... size) {
		final T m = zeros(size);
		m.nans(Ret.ORIG);
		return m;
	}

	public final T eye(final long... size) {
		final T m = zeros(size);
		m.eye(Ret.ORIG);
		return m;
	}

	public final T rand(final long rows, final long cols) {
		final T m = zeros(rows, cols);
		m.rand(Ret.ORIG);
		return m;
	}

	public final T randn(final long rows, final long cols) {
		final T m = zeros(rows, cols);
		m.randn(Ret.ORIG);
		return m;
	}

	public final T ones(final long rows, final long cols) {
		final T m = zeros(rows, cols);
		m.ones(Ret.ORIG);
		return m;
	}

	public final T eye(final long rows, final long cols) {
		final T m = zeros(rows, cols);
		m.eye(Ret.ORIG);
		return m;
	}

	public final DenseDoubleMatrix2D rosserMatrix() {
		return linkToArray(new double[][] { { 611, 196, -192, 407, -8, -52, -49, 29 },
				{ 196, 899, 113, -192, -71, -43, -8, -44 }, { -192, 113, 899, 196, 61, 49, 8, 52 },
				{ 407, -192, 196, 611, 8, 44, 59, -23 }, { -8, -71, 61, 8, 411, -599, 208, 208 },
				{ -52, -43, 49, 44, -599, 411, 208, 208 }, { -49, -8, 8, 59, 208, 208, 99, -911 },
				{ 29, -44, 52, -23, 208, 208, -911, 99 } });
	}

	public final DenseMatrix wilkinsonMatrix(int size) {
		DenseMatrix m = Matrix.Factory.zeros(size, size);
		int j = (size - 1) / 2;
		for (int i = 0; i < j; i++) {
			m.setAsDouble(1, i, i + 1);
			m.setAsDouble(1, i + 1, i);
			m.setAsDouble(j - i, i, i);
			m.setAsDouble(j - i, size - 1 - i, size - 1 - i);
			m.setAsDouble(1, size - 1 - i, size - 2 - i);
			m.setAsDouble(1, size - 2 - i, size - 1 - i);
		}
		return m;
	}

	public final DenseMatrix correlatedColumns(int rows, int columns, double correlationFactor) {
		DenseMatrix ret = DenseMatrix.Factory.zeros(rows, columns);

		DenseMatrix orig = DenseMatrix.Factory.randn(rows, 1);

		for (int c = 0; c < columns; c++) {
			DenseMatrix rand = DenseMatrix.Factory.randn(rows, 1);

			for (int r = 0; r < rows; r++) {
				ret.setAsDouble((orig.getAsDouble(r, 0) * correlationFactor)
						+ ((1.0 - correlationFactor) * rand.getAsDouble(r, 0)), r, c);
			}
		}

		return ret;
	}

}

 

Ads help maintain this website.