AbstractIntervalDerivativeMatrix.java
/*
* Created on 2007/10/06
* Copyright (C) 2007 Koga Laboratory. All rights reserved.
*
*/
package org.mklab.cga.derivative;
import java.io.Writer;
import org.mklab.cga.interval.matrix.IntervalNumericalMatrix;
import org.mklab.cga.interval.scalar.IntervalNumericalScalar;
import org.mklab.nfc.matrix.AbstractNumericalMatrix;
import org.mklab.nfc.matrix.NumericalMatrix;
import org.mklab.nfc.scalar.NumericalScalar;
/**
* {@link AbstractIntervalDerivativeNumber}を要素として持つ行列クラスです。
*
* @author yano
* @version $Revision: 1.15 $, 2007/10/06
* @param <IDS> 区間微分スカラーの型
* @param <IDM> 区間微分行列の型
* @param <IS> 区間スカラーの型
* @param <IM> 区間行列の型
* @param <S> スカラーの型
* @param <M> 行列の型
*/
public abstract class AbstractIntervalDerivativeMatrix<IDS extends IntervalDerivativeNumber<IDS ,IDM,IS,IM,S,M>, IDM extends IntervalDerivativeMatrix<IDS,IDM,IS,IM,S,M>, IS extends IntervalNumericalScalar<IS,IM,S,M>, IM extends IntervalNumericalMatrix<IS,IM,S,M>, S extends NumericalScalar<S,M>, M extends NumericalMatrix<S,M> > extends AbstractNumericalMatrix<IDS,IDM> implements IntervalDerivativeMatrix<IDS,IDM,IS,IM,S,M>{
/** シリアル番号 */
private static final long serialVersionUID = -2028857873973993340L;
// TODO コンストラクターをリファクタリングする
/**
* コンストラクター
*
* @param elements 行列の成分
*/
public AbstractIntervalDerivativeMatrix(IDS[][] elements) {
this(elements.length, elements.length == 0 ? 0 : elements[0].length, elements);
}
/**
* コンストラクター
*
* @param elements 行列の成分
*/
public AbstractIntervalDerivativeMatrix(IDS[] elements) {
super(elements);
}
/**
* コンストラクター
*
* @param rowSize 行の数
* @param columnSize 列の数
* @param elements 行列の成分
*/
public AbstractIntervalDerivativeMatrix(int rowSize, int columnSize, IDS[][] elements) {
super(rowSize, columnSize, elements);
}
/**
* {@inheritDoc}
*/
public IM getX() {
IDS[][] elements = getElements();
IS[][] x = elements[0][0].getX().createArray(getRowSize(), getColumnSize());
for (int i = 0; i < getRowSize(); i++) {
for (int j = 0; j < getColumnSize(); j++) {
x[i][j]= elements[i][j].getX();
}
}
return x[0][0].createGrid(x);
}
/**
* {@inheritDoc}
*/
public IM getDX() {
IDS[][] elements = getElements();
IS[][] dx = elements[0][0].getDX().createArray(getRowSize(), getColumnSize());
for (int i = 0; i < getRowSize(); i++) {
for (int j = 0; j < getColumnSize(); j++) {
dx[i][j]= elements[i][j].getDX();
}
}
return dx[0][0].createGrid(dx);
}
// /**
// * コンストラクター
// *
// * @param matrix 行列の成分
// */
// public AbstractIntervalDerivativeMatrix(IM matrix) {
// super(matrix.getRowSize(), matrix.getColumnSize());
//
// IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
// for (int row = 1; row <= matrix.getRowSize(); row++) {
// for (int col = 1; col <= matrix.getColumnSize(); col++) {
// derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement(row, col));
// }
// }
// setElements(derivatives);
// }
// /**
// * コンストラクター
// *
// * @param matrix 行列
// * @param unit 単位
// */
// public AbstractIntervalDerivativeMatrix(M matrix, M unit) {
// super(matrix.getRowSize(), matrix.getColumnSize());
//
// boolean isVariable = unit.isUnit();
//
// S scalar = unit.getElement(1, 1);
// IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
// for (int row = 1; row <= matrix.getRowSize(); row++) {
// for (int col = 1; col <= matrix.getColumnSize(); col++) {
// if (isVariable) {
// derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement(row, col), scalar.createUnit());
// } else {
// derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement(row, col));
// }
// }
// }
// setElements(derivatives);
// }
// /**
// * コンストラクター
// *
// * @param matrix 行列の成分
// */
// public AbstractIntervalDerivativeMatrix(DoubleMatrix matrix) {
// super(matrix.getRowSize(), matrix.getColumnSize());
//
// IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
// for (int row = 1; row <= matrix.getRowSize(); row++) {
// for (int col = 1; col <= matrix.getColumnSize(); col++) {
// derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getDoubleElement(row, col));
// }
// }
// setElements(derivatives);
// }
//
// /**
// * コンストラクター
// *
// * @param matrix 行列
// * @param unit 単位
// */
// public AbstractIntervalDerivativeMatrix(DoubleMatrix matrix, DoubleMatrix unit) {
// super(matrix.getRowSize(), matrix.getColumnSize());
//
// boolean isVariable = unit.isUnit();
// IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
// for (int row = 1; row <= matrix.getRowSize(); row++) {
// for (int col = 1; col <= matrix.getColumnSize(); col++) {
// if (isVariable) {
// derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getDoubleElement(row, col), 1);
// } else {
// derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getDoubleElement(row, col));
// }
// }
// }
// setElements(derivatives);
// }
// /**
// * コンストラクター
// *
// * @param matrix 区間行列
// */
// public AbstractIntervalDerivativeMatrix(IM matrix) {
// super(matrix.getRowSize(), matrix.getColumnSize());
//
// IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
// for (int row = 1; row <= matrix.getRowSize(); row++) {
// for (int col = 1; col <= matrix.getColumnSize(); col++) {
// derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement((row - 1) * matrix.getColumnSize() + (col - 1) % matrix.getColumnSize() + 1));
// }
// }
// setElements(derivatives);
// }
// /**
// * コンストラクター
// *
// * @param matrix 区間行列
// * @param unit 単位
// */
// public AbstractIntervalDerivativeMatrix(IM matrix, Matrix unit) {
// super(matrix.getRowSize(), matrix.getColumnSize());
//
// IS u = matrix.getElement(1, 1).createUnit();
//
// IDS[][] derivatives = new AbstractIntervalDerivative[matrix.getRowSize()][matrix.getColumnSize()];
// boolean isVariable = unit.isUnit();
// for (int row = 1; row <= matrix.getRowSize(); row++) {
// for (int col = 1; col <= matrix.getColumnSize(); col++) {
// if (isVariable) {
// derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement((row - 1) * matrix.getColumnSize() + (col - 1) % matrix.getColumnSize() + 1), u.create(1));
// } else {
// derivatives[row - 1][col - 1] = new AbstractIntervalDerivative<>(matrix.getElement((row - 1) * matrix.getColumnSize() + (col - 1) % matrix.getColumnSize() + 1));
// }
// }
// }
//
// setElements(derivatives);
// }
// /**
// * 自身との除算を求めます。
// *
// * @param value 割る値
// * @return 自身との除算
// */
// // TODO 親クラスのメソッドでテストを通るようにして、このクラスから削除する
// public IDM divide(IDS value) {
// return divideElementWise(value);
// }
// /**
// * 自身と成分ごとの除算を求めます。
// *
// * @param value 割る値
// * @return 自身と成分ごとの除算の結果
// */
// // TODO 引数を行列にする
// // TODO 親クラスのメソッドでテストを通るようにして、このクラスから削除する
// public IDM divideElementWise(IDS value) {
// IDS[][] ans = new AbstractIntervalDerivative[getRowSize()][getColumnSize()];
//
// final IDS[][] elements = getElements();
//
// for (int i = 0; i < getRowSize(); i++) {
// IDS[] a1i = elements[i];
// IDS[] ansi = ans[i];
// for (int j = 0; j < getColumnSize(); j++) {
// ansi[j] = a1i[j].divide(value);
// }
// }
// return new AbstractIntervalDerivativeMatrix(ans);
// }
/**
* {@inheritDoc}
*/
@Override
public void printElements(Writer writer) {
super.printElements(writer);
// TODO
}
/**
* {@inheritDoc}
*/
@Override
public void printElements(Writer writer, int maxColumnSize) {
super.printElements(writer, maxColumnSize);
// TODO
}
}