AbstractPlotter.java

/*
 * Created on 2005/08/03
 * Copyright (C) 2005 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.graph;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.IntMatrix;
import org.mklab.nfc.scalar.DoubleNumberUtil;
import org.mklab.tool.graph.gnuplot.decoration.LogScale;


/**
 * @author koga
 * @version $Revision: 1.19 $, 2005/08/03
 */
public abstract class AbstractPlotter implements Plotter {

  /**
   * @param xData x方向のデータ
   */
  public void plot(DoubleMatrix xData) {
    setLogScale(LogScale.LOG_SCALE_NO);
    plot1D(xData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   */
  public void plot(DoubleMatrix xData, DoubleMatrix yData) {
    plot(xData, yData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   */
  public void plot(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames) {
    plot(xData, yData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void plot(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames, String[] attribute1) {
    plot(xData, yData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void plot(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames, String[] attribute1, String[] attribute2) {
    setLogScale(LogScale.LOG_SCALE_NO);
    plot2D(xData, yData, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   */
  public void plot(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData) {
    plot(xData, yData, zData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   */
  public void plot(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames) {
    plot(xData, yData, zData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void plot(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1) {
    plot(xData, yData, zData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void plot(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1, String[] attribute2) {
    setLogScale(LogScale.LOG_SCALE_NO);
    plot3D(xData, yData, zData, lineNames, attribute1, attribute2);
  }

  /**
   * @param zData z方向のデータ
   */
  public void plotSurface(DoubleMatrix zData) {
    setLogScale(LogScale.LOG_SCALE_NO);
    plot3DSurface(zData);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   */
  @SuppressWarnings("nls")
  public void plotSurface(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData) {
    plotSurface(xData, yData, zData, "", "", "");
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineName ラインの名前
   */
  @SuppressWarnings("nls")
  public void plotSurface(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String lineName) {
    plotSurface(xData, yData, zData, lineName, "", "");
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineName ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  @SuppressWarnings("nls")
  public void plotSurface(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String lineName, String attribute1) {
    plotSurface(xData, yData, zData, lineName, attribute1, "");
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineName ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void plotSurface(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String lineName, String attribute1, String attribute2) {
    setLogScale(LogScale.LOG_SCALE_NO);
    plot3DSurface(xData, yData, zData, lineName, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   */
  public void semilogx(DoubleMatrix xData, DoubleMatrix yData) {
    semilogx(xData, yData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   */
  public void semilogx(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames) {
    semilogx(xData, yData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void semilogx(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames, String[] attribute1) {
    semilogx(xData, yData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void semilogx(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredX = getNonZeroAssuredMatrix(xData);
    setGridVisible(true);
    setLogScale(LogScale.LOG_SCALE_X);
    plot2D(assuredX, yData, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   */
  public void semilogx(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData) {
    semilogx(xData, yData, zData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   */
  public void semilogx(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames) {
    semilogx(xData, yData, zData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void semilogx(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1) {
    semilogx(xData, yData, zData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void semilogx(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredX = getNonZeroAssuredMatrix(xData);
    setGridVisible(true);
    setLogScale(LogScale.LOG_SCALE_X);
    plot3D(assuredX, yData, zData, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   */
  public void semilogy(DoubleMatrix xData, DoubleMatrix yData) {
    semilogy(xData, yData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   */
  public void semilogy(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames) {
    semilogy(xData, yData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void semilogy(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames, String[] attribute1) {
    semilogy(xData, yData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void semilogy(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredY = getNonZeroAssuredMatrix(yData);
    setGridVisible(true);
    setLogScale(LogScale.LOG_SCALE_Y);
    plot2D(xData, assuredY, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   */
  public void semilogy(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData) {
    semilogy(xData, yData, zData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   */
  public void semilogy(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames) {
    semilogy(xData, yData, zData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void semilogy(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1) {
    semilogy(xData, yData, zData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void semilogy(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredY = getNonZeroAssuredMatrix(yData);
    setGridVisible(true);
    setLogScale(LogScale.LOG_SCALE_Y);
    plot3D(xData, assuredY, zData, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   */
  public void semilogz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData) {
    semilogz(xData, yData, zData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   */
  public void semilogz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames) {
    semilogz(xData, yData, zData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void semilogz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1) {
    semilogz(xData, yData, zData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void semilogz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredZ = getNonZeroAssuredMatrix(zData);
    setGridVisible(true);
    setLogScale(LogScale.LOG_SCALE_Z);
    plot3D(xData, yData, assuredZ, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   */
  public void loglog(DoubleMatrix xData, DoubleMatrix yData) {
    loglog(xData, yData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   */
  public void loglog(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames) {
    loglog(xData, yData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void loglog(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames, String[] attribute1) {
    loglog(xData, yData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void loglog(DoubleMatrix xData, DoubleMatrix yData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredX = getNonZeroAssuredMatrix(xData);
    DoubleMatrix assuredY = getNonZeroAssuredMatrix(yData);
    setGridVisible(true);
    setLogScale(LogScale.LOG_SCALE_XY);
    plot2D(assuredX, assuredY, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   */
  public void semilogxy(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData) {
    semilogxy(xData, yData, zData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   */
  public void semilogxy(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames) {
    semilogxy(xData, yData, zData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void semilogxy(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1) {
    semilogxy(xData, yData, zData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void semilogxy(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredX = getNonZeroAssuredMatrix(xData);
    DoubleMatrix assuredY = getNonZeroAssuredMatrix(yData);
    setGridVisible(true);
    setLogScale(LogScale.LOG_SCALE_XY);
    plot3D(assuredX, assuredY, zData, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   */
  public void semilogxz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData) {
    semilogxz(xData, yData, zData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   */
  public void semilogxz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames) {
    semilogxz(xData, yData, zData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void semilogxz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1) {
    semilogxz(xData, yData, zData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void semilogxz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredX = getNonZeroAssuredMatrix(xData);
    DoubleMatrix assuredZ = getNonZeroAssuredMatrix(zData);
    setLogScale(LogScale.LOG_SCALE_XZ);
    setGridVisible(true);
    plot3D(assuredX, yData, assuredZ, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   */
  public void semilogyz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData) {
    semilogyz(xData, yData, zData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   */
  public void semilogyz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames) {
    semilogyz(xData, yData, zData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void semilogyz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1) {
    semilogyz(xData, yData, zData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void semilogyz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredY = getNonZeroAssuredMatrix(yData);
    DoubleMatrix assuredZ = getNonZeroAssuredMatrix(zData);
    setGridVisible(true);
    setLogScale(LogScale.LOG_SCALE_YZ);
    plot3D(xData, assuredY, assuredZ, lineNames, attribute1, attribute2);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   */
  public void semilogxyz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData) {
    semilogxyz(xData, yData, zData, new String[0], new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   */
  public void semilogxyz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames) {
    semilogxyz(xData, yData, zData, lineNames, new String[0], new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   */
  public void semilogxyz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1) {
    semilogxyz(xData, yData, zData, lineNames, attribute1, new String[0]);
  }

  /**
   * @param xData x方向のデータ
   * @param yData y方向のデータ
   * @param zData z方向のデータ
   * @param lineNames ラインの名前
   * @param attribute1 ラインの名前の前に指定する属性
   * @param attribute2 ラインの名前の後に指定する属性
   */
  public void semilogxyz(DoubleMatrix xData, DoubleMatrix yData, DoubleMatrix zData, String[] lineNames, String[] attribute1, String[] attribute2) {
    DoubleMatrix assuredX = getNonZeroAssuredMatrix(xData);
    DoubleMatrix assuredY = getNonZeroAssuredMatrix(yData);
    DoubleMatrix assuredZ = getNonZeroAssuredMatrix(zData);
    setGridVisible(true);
    setLogScale(LogScale.LOG_SCALE_XYZ);
    plot3D(assuredX, assuredY, assuredZ, lineNames, attribute1, attribute2);
  }

  /**
   * 3次元空間に2次元平面を描画します。
   * 
   * @param zData z方向のデータ
   */
  @SuppressWarnings("nls")
  public void plot3DSurface(DoubleMatrix zData) {
    int xSize = zData.getRowSize();
    int ySize = zData.getColumnSize();

    DoubleMatrix xData = new DoubleMatrix(xSize, ySize);
    for (int i = 1; i <= xSize; i++) {
      xData.setRowVector(i, new DoubleMatrix(IntMatrix.series(1, ySize)));
    }

    DoubleMatrix yData = new DoubleMatrix(ySize, xSize);
    for (int i = 1; i <= ySize; i++) {
      yData.setRowVector(i, new DoubleMatrix(IntMatrix.series(1, xSize)));
    }
    yData = yData.transpose();

    plot3DSurface(xData, yData, zData, "", "", "");
  }

  /**
   * 成分が零ならば、その成分を微小な値に置き換えが行列を生成します。
   * 
   * @param xData x方向のデータ 成分を調べる行列
   * @return 生成された行列
   */
  private DoubleMatrix getNonZeroAssuredMatrix(DoubleMatrix xData) {
    IntMatrix idxx = xData.getColumnVector(1).compareElementWise(".==", 0).find(); //$NON-NLS-1$
    if (idxx.length() != 0) {
      DoubleMatrix tolerance = DoubleMatrix.ones(idxx.length(), 1).multiply(DoubleNumberUtil.EPS);
      DoubleMatrix cloneX = xData.createClone();
      cloneX.setSubMatrix(idxx, 1, tolerance);
      return cloneX;
    }

    return xData;
  }
}