Cond.java

/*
 * $Id: Cond.java,v 1.17 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;


/**
 * 2ノルムに関する条件数を求めるクラスです。
 * 
 * <p>Condition number in 2-norm
 * 
 * @author koga
 * @version $Revision: 1.17 $
 */
public class Cond {

  /**
   * 2ノルムに関する条件数( <code>A</code> 最小特異値と 最大特異値の比を求める)を求めます。
   * 
   * @param A 対象となる行列
   * @return 条件数 (condition number)
   */
  public static DoubleNumber cond(DoubleMatrix A) {
    if (A.length() == 0) {
      System.err.println(Messages.getString("Cond.0")); //$NON-NLS-1$
      return new DoubleNumber(Double.NaN);
    }

    DoubleMatrix values = A.singularValue();

    if (values.compareElementWise(".==", 0).anyTrue()) { //$NON-NLS-1$
      System.err.println(Messages.getString("Cond.1")); //$NON-NLS-1$
      return new DoubleNumber(Double.POSITIVE_INFINITY);
    }

    DoubleNumber c = values.max().divide(values.min());
    return c;
  }
}