Gammaf.java

/*
 * $Id: Gammaf.java,v 1.18 2008/07/16 15:40:00 koga Exp $
 * 
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.matrix;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.scalar.DoubleNumber;


/**
 * 完全・不完全ガンマ関数を表すクラスです。
 * 
 * <p> Complete and incomplete Gamma functions
 * 
 * @author koga
 * @version $Revision: 1.18 $
 * @see org.mklab.tool.matrix.Gammac
 * @see org.mklab.tool.matrix.Gammai
 */
public class Gammaf {

  /**
   * <code>a</code>の全ての成分について、完全ガンマ関数の値を 返します。
   * 
   * @param a データ
   * @return 完全・不完全ガンマ関数の値 (value of function)
   */
  public static DoubleMatrix gammaf(DoubleMatrix a) {
    return Gammac.gammac(a);
  }

  /**
   * <code>a</code>の成分について、不完全ガンマ関数の値(<code>X</code>まで積分した値) を返します。 <code>a</code>と<code>x</code>は同じ大きさの行列でなければならない。
   * 
   * @param a_ データ
   * @param x_ 積分区間
   * @return 完全・不完全ガンマ関数の値 (value of function)
   */
  public static DoubleMatrix gammaf(DoubleMatrix a_, DoubleMatrix x_) {
    DoubleMatrix a = a_;
    DoubleMatrix x = x_;
    DoubleMatrix b = a.createZero(a.getRowSize(), a.getColumnSize());

    int m = a.getRowSize();
    int n = a.getColumnSize();
    int mm = x.getRowSize();
    int nn = x.getColumnSize();
    if (m != mm || n != nn) {
      if (m == 1 && n == 1) {
        a = x.createOnes(x.getRowSize(), x.getColumnSize()).multiply(a.getElement(1, 1));
      } else if (mm == 1 && nn == 1) {
        x = a.createOnes(a.getRowSize(), a.getColumnSize()).multiply(x.getElement(1, 1));
      } else {
        throw new RuntimeException(Messages.getString("Gammaf.0")); //$NON-NLS-1$
      }
    }

    DoubleNumber unit = a.getElement(1);

    for (int i = 1; i <= a.getColumnSize() * a.getRowSize(); i++) {
      DoubleMatrix gam = Gammai.gammai(unit.createGrid(new DoubleNumber[] {a.getElement(i)}), x.getElement(i));
      b.setElement(i, gam.getElement(1, 1));
    }

    return b;
  }

//  /**
//   * <code>a</code>の全ての成分について、完全ガンマ関数の値を 返します。
//   * 
//   * @param a データ
//   * @return 完全・不完全ガンマ関数の値 (value of function)
//   */
//  public static DoubleMatrix gammaf(DoubleMatrix a) {
//    return Gammac.gammac(a);
//  }

//  /**
//   * <code>a</code>の成分について、不完全ガンマ関数の値(<code>X</code>まで積分した値) を返します。 <code>a</code>と<code>x</code>は同じ大きさの行列でなければならない。
//   * 
//   * @param a_ データ
//   * @param x_ 積分区間
//   * @return 完全・不完全ガンマ関数の値 (value of function)
//   */
//  public static DoubleMatrix gammaf(DoubleMatrix a_, DoubleMatrix x_) {
//    DoubleMatrix a = a_;
//    DoubleMatrix x = x_;
//    DoubleMatrix b = new DoubleMatrix(a.getRowSize(), a.getColumnSize());
//
//    int m = a.getRowSize();
//    int n = a.getColumnSize();
//    int mm = x.getRowSize();
//    int nn = x.getColumnSize();
//    if (m != mm || n != nn) {
//      if (m == 1 && n == 1) {
//        a = DoubleMatrix.ones(x).multiply(a.getDoubleElement(1, 1));
//      } else if (mm == 1 && nn == 1) {
//        x = DoubleMatrix.ones(a).multiply(x.getDoubleElement(1, 1));
//      } else {
//        throw new IllegalArgumentException(Messages.getString("Gammaf.1")); //$NON-NLS-1$
//      }
//    }
//
//    for (int i = 1; i <= a.getColumnSize() * a.getRowSize(); i++) {
//      DoubleMatrix gam = Gammai.gammai(new DoubleMatrix(new double[] {a.getDoubleElement(i)}), x.getDoubleElement(i));
//      b.setElement(i, gam.getDoubleElement(1, 1));
//    }
//
//    return b;
//  }
}