MatrixExportSink.java
/**
* $Id: DoubleMatrixExportSink.java,v 1.15 2008/06/08 04:28:11 koga Exp $
*
* Copyright (C) 2004-2005 Koga Laboratory. All rights reserved.
*/
package org.mklab.tool.control.system.sink;
import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.nleq.NonLinearEquationSolver;
import org.mklab.nfc.ode.EquationSolver;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;
/**
* {@link DoubleMatrix}に入力信号を格納する、信号のエキスポート先を表わすクラスです。
*
* @author koga
* @version $Revision: 1.15 $
* @param <RS> type of real scalar
* @param <RM> type of real matrix
* @param <CS> type of complex scalar
* @param <CM> type of complex matrix
*/
public abstract class MatrixExportSink<RS extends RealNumericalScalar<RS,RM,CS,CM>, RM extends RealNumericalMatrix<RS,RM,CS,CM>, CS extends ComplexNumericalScalar<RS,RM,CS,CM>, CM extends ComplexNumericalMatrix<RS,RM,CS,CM>> extends ExportSink<RS,RM,CS,CM> {
/** 信号の系列の長さの単位 */
private final int capacityUnit = 1000;
/** 信号の系列の長さ */
private int dataLength = 0;
/** 信号の系列 */
private RM data;
/**
* 新しく生成された<code>DoubleMatrixExportSink</code>オブジェクトを初期化します。
* @param sunit unit of scalar
*/
public MatrixExportSink(RS sunit) {
super(sunit);
}
/**
* {@inheritDoc}
*/
@Override
public void initialize() {
this.data =this.sunit.createZeroGrid(getInputSize() + 1, this.capacityUnit);
}
/**
* {@inheritDoc}
*/
@Override
public RM outputEquation(final RS t, final RM u) {
// 方程式のソルバーが仮の値で計算しているか判定します
final boolean solverTrial = EquationSolver.isTrial() || NonLinearEquationSolver.isTrial();
if (solverTrial == false) {
if (this.data.getColumnSize() <= this.dataLength) {
this.data = this.data.resize(getInputSize() + 1, this.dataLength + this.capacityUnit);
}
this.data.setElement(1, this.dataLength + 1, t);
int uSize = getInputSize();
this.data.setSubMatrix(2, 2 + uSize - 1, this.dataLength + 1, this.dataLength + 1, u.createClone());
this.dataLength++;
}
return u.createClone();
}
/**
* {@inheritDoc}
*/
@Override
public void open() {
this.dataLength = 0;
this.data = this.sunit.createZeroGrid(getInputSize() + 1, this.capacityUnit);
}
/**
* データの長さを返します。
*
* @return データの長さ
*/
public int getDataLength() {
return this.dataLength;
}
/**
* データを返します。
*
* @return データ
*/
public RM getData() {
return this.data.getColumnVectors(1, this.dataLength);
}
}