syevx#

実対称行列 A の選択された固有値と、オプションで固有ベクトルを計算します。このルーチンは、oneapi::mkl::lapack 名前空間に属します。

説明#

このルーチンは、実対称行列 A の選択された固有値、およびオプションで固有ベクトルを計算します。固有値と固有ベクトルは、目的の固有値の値の範囲またはインデックスの範囲を指定して選択できます。言い換えれば、A*z = z*λ となるような A の選択された固有対 (λ, z) を計算できます。

このルーチンは、二分アルゴリズムを使用して選択された固有値を計算します。

固有ベクトルが要求された場合、このルーチンは、インドラジット・ディヨン氏とベレスフォード・パーレット氏の研究に基づく修正ツイスト因数分解アルゴリズムと、逆反復アルゴリズムに続くグラムシュミット直交化の組み合わせを使用します。

API#

構文#

namespace oneapi::mkl::lapack { 
  void syevx(sycl::queue &queue, 
  mkl::job jobz, 
  mkl::rangev range, 
  mkl::uplo uplo, 
  int64_t n, 
  sycl::buffer<T> &a, 
  int64_t lda, 
  T vl, 
  T vu, 
  int64_t il, 
  int64_t iu, 
  T abstol, 
  sycl::buffer<int64_t> &m, 
  sycl::buffer<T> &w, 
  sycl::buffer<T> &z, 
  int64_t ldz, 
  sycl::buffer<T> &scratchpad, 
  int64_t scratchpad_size) 
}

syevx は次の精度とデバイスをサポートします。

T

サポートされるデバイス

float

CPU および GPU*

double

CPU および GPU*

*インターフェイスのサポートのみ。すべての計算は CPU 上で実行されます。

入力パラメーター#

queue

計算が実行されるデバイスキュー。

jobz

job::novec または job::vec である必要があります。

jobz = job::novec の場合、固有値のみが計算されます。

jobz = job::vec の場合、固有値と固有ベクトルが計算されます。

range

rangev::allrangev::values または rangev::indices である必要があります。

range = rangev::all の場合、すべての固有値と固有ベクトル (jobz パラメーターによって要求された場合) が計算されます。

range = rangev::values の場合、区間 (vl, vu] 内の固有値と対応する固有ベクトル (jobz パラメーターで要求された場合) が計算されます。

range = rangev::indices の場合、il 番目から iu 番目の固有値と対応する固有ベクトル (jobz パラメーターによって要求された場合) が計算されます。

uplo

uplo::upper または uplo::lower である必要があります。

uplo = uplo::upper の場合、a は A の上三角部分を格納します。

uplo = uplo::lower の場合、a は A の下三角部分を格納します。

n

行列 A の次数 (0 n)。

a

uplo で指定された対称行列 A の上三角形または下三角形を含むサイズ a(lda,*) の配列を保持するバッファー。

a の 2 番目の次元は max(1, n) 以上でなければなりません。

lda

a の先頭次元; max(1,n) 以上である必要があります。

vl

range = rangev::values の場合、固有値を検索する間隔の下限。vlvu より小さくなければなりません。range = rangev::all または range = rangev::indices の場合は参照されません。

vu

range = rangev::values の場合、固有値を検索する間隔の上限。vlvu より小さくなければなりません。range = rangev::all または range = rangev::indices の場合は参照されません。

il

range = rangev::indices の場合、返される最小固有値の 1 ベースのインデックス。n > 0 の場合は 1 il iu n で、n = 0 の場合は il = 1 および iu = 0 でなければなりません。range = rangev::all または range = rangev::values の場合は参照されません。

iu

range = rangev::indices の場合、返される最大固有値の 1 ベースのインデックス。n > 0 の場合は 1 il iu n で、n = 0 の場合は il = 1 および iu = 0 でなければなりません。range = rangev::all または range = rangev::values の場合は参照されません。

abstol

固有値の絶対誤差許容値。近似固有値は、abstol + eps *  max( |a|,|b| ) 以下の幅の区間 [a,b] 内にあると判断されたときに収束したとみなされます。ここで、eps はマシン精度です。abstol が 0 以下の場合、代わりに eps*|T| が使用されます。ここで、|T| は、A を三角形式に縮小することによって得られる三角行列の 1 ノルムです。

ldz

z の先頭次元。max(1,n) 以上である必要があります。

scratchpad

ルーチンが中間結果を維持するスクラッチパッド・メモリーを保持するバッファー。

scratchpad_size

T タイプの浮動小数点要素の数であるスクラッチパッド・メモリーのサイズ。サイズは、syevx_scratchpad_size 関数が返す値以下であってはなりません。

出力パラメーター#

a

終了時に、対角線を含む A の上三角形 (uplo = uplo::upper の場合) または下三角形 (uplo = uplo::lower の場合) が破棄されます。

m

検出されの固有値の総数、0 m n

w

少なくとも n サイズの配列を保持するバッファー。正常終了時には、最初の m 要素に選択された固有値が昇順で格納されます。

z

jobz = job::vec の場合、通常の終了時に、Z の最初の m 列には、選択された固有値に対応する行列 A の直交固有ベクトルが含まれ、Z の i 番目の列には、w(i) に関連付けられた固有ベクトルが保持されます。jobz = job::novec の場合、Z は参照されません。注: ユーザーは配列 Z に少なくとも max(1, m) 列が指定されていることを確認する必要があります。range = rangev::values の場合、m の正確な値は事前に不明であるため、上限を使用する必要があります。

例外#

例外

説明

mkl::lapack::exception

この例外は、計算中に問題が発生した場合にスローされます。例外オブジェクトの info() メソッドを使用して、問題の情報コードを取得できます。

info = -i の場合、i 番目のパラメーターの値が不正です。

info = i、かつ jobz = job::novec の場合、アルゴリズムは収束に失敗しました。

info = i、かつ jobz = job::vec の場合、アルゴリズムは固有値の計算に失敗しました。

info がスクラッチパッドのサイズとして渡された値と等しく、detail() がゼロ以外を返す場合、渡されたスクラッチパッドのサイズが十分ではなく、必要なサイズは例外オブジェクトの detail() メソッドによって返される値以上である必要があります。