Dcopy.java

package org.mklab.sdpj.gpack.blaswrap;

import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;


/**
 * @author takafumi
 * @param <RS> 実スカラーの型
 * @param <RM> 実行列の型
 * @param <CS> 複素スカラーの型
 * @param <CM> 複素行列の型
 */
public class Dcopy<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>> {

  /**
   * 配列xをyにコピーします。 配列は参照渡しなので、このメソッドを呼び出した後のdyは dxをコピーしたものとなります。
   * 
   * @param size 成分の数
   * @param x x
   * @param incx x成分の指数の増分
   * @param y y
   * @param incy y成分の指数の増分
   */
  void dcopy(int size, double[] x, int incx, double[] y, int incy) {
    if (incx == 1 && incy == 1) {
      System.arraycopy(x, 0, y, 0, size);
      return;
    }

    int ix = 0;
    int iy = 0;
    if (incx < 0) {
      ix = (-(size) + 1) * incx;
    }
    if (incy < 0) {
      iy = (-(size) + 1) * incy;
    }
    for (int i = 1; i <= size; ++i) {
      y[iy] = x[ix];
      ix += incx;
      iy += incy;
    }
  }

  /**
   * xをyへコピーします。
   * 
   * @param size 成分の数
   * @param x x
   * @param incx x成分の指数の増分
   * @param y y
   * @param incy y成分の指数の増分
   */
  void dcopy(int size, RS[] x, int incx, RS[] y, int incy) {
    if (incx == 1 && incy == 1) {
      System.arraycopy(x, 0, y, 0, size);
      return;
    }

    int ix = 0;
    int iy = 0;
    if (incx < 0) {
      ix = (-(size) + 1) * incx;
    }
    if (incy < 0) {
      iy = (-(size) + 1) * incy;
    }
    for (int i = 1; i <= size; ++i) {
      y[iy] = x[ix];
      ix += incx;
      iy += incy;
    }
  }
}