gesvd (USM バージョン)#

一般長方形行列の特異値分解を計算します。このルーチンは、oneapi::mkl::lapack 名前空間に属します。

説明#

このルーチンは、実数/複素数 mn 列の行列 A の特異値分解 (SVD) を計算し、オプションで左特異ベクトルと右特異ベクトルを計算します。SVD は次のように記述されます。

  • 実ルーチンの場合、A = U*Σ*VT

  • 複素数ルーチンの場合、A = U*Σ*VH

ここで、Σ は mn 列の対角行列、Umm 列の直交/ユニタリー行列、Vnn 列の直交/ユニタリー行列です。Σ の対角要素は A の特異値です。これらは実数かつ非負であり、降順で返されます。UV の最初の min(m, n) 列は、A の左特異ベクトルと右特異ベクトルです。

API#

構文#

namespace oneapi::mkl::lapack { 
  sycl::event gesvd(sycl::queue &queue, 
  mkl::jobsvd jobu, 
  mkl::jobsvd jobvt, 
  int64_t m, 
  int64_t n, 
  T *a, 
  int64_t lda, 
  RealT *s, 
  T *u, 
  int64_t ldu, 
  T *vt, 
  int64_t ldvt, 
  T *scratchpad, 
  int64_t scratchpad_size, 
  const std::vector<sycl::event> &events = {}) 
}

gesvd (USM バージョン) は、次の精度とデバイスをサポートします。

T

サポートされるデバイス

float

CPU

double

CPU

std::complex<float>

CPU

std::complex<double>

CPU

入力パラメーター#

queue

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

jobu

jobsvd::vectorsjob::somevecjobsvd::vectorsina、または job::novec である必要があります。行列 U のすべてまたは一部を計算するオプションを指定します。

jobu = jobsvd::vectors の場合、U のすべての m 列が配列 u に返されます;

jobu = job::somevec の場合、U の最初の min(m, n) 列 (左特異ベクトル) が配列 u に返されます;

jobu = jobsvd::vectorsina の場合、U の最初の min(m, n) 列 (左特異ベクトル) が配列 u に上書きされます;

jobu = job::novec の場合、U の列 (左特異ベクトルがない) は計算されません 。

jobvt

jobsvd::vectors, job::somevecjobsvd::vectorsina、または job::novec である必要があります。行列 VT/VH のすべてまたは一部を計算するオプションを指定します。

jobvt = jobsvd::vectors の場合、VT/VH のすべての n 列が配列 vt に返されます;

jobvt = job::somevec の場合、VT/VH (左特異ベクトル) の最初の min(m, n) 列が配列 vt に返されます;

jobvt = jobsvd::vectorsina の場合、VT/VH (左特異ベクトル) の最初の min(m, n) 列 が配列 a に上書きされます;

jobvt = job::novec の場合、VT/VH (左特異ベクトルがない) の列は計算されません 。

jobvt と jobu の両方を jobsvd::vectorsina にすることはできません。

m

行列 A の行数 (0 m)。

n

行列 A の列数 (0 n)。

a

配列 a へのポインター、サイズ (lda,*)a の 2 番目の次元は max(1, n) 以上でなければなりません。

lda

a の先頭次元。

ldu

u の先頭次元。

ldvt

vt の先頭次元。

scratchpad

ルーチンが中間結果を保存するスクラッチパッド・メモリーへのポインター。

scratchpad_size

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

events

計算を開始する前に待機するイベントのリスト。デフォルトでは空のリストになります。

出力パラメーター#

a

終了時、

jobu = jobsvd::vectorsina の場合、a は U の最初の min(m,n) 列 (列ごとに格納された左特異ベクトル) で上書きされます;

jobvt = jobsvd::vectorsina の場合、a は VT/VH (列ごとに格納された左特異ベクトル) の最初の min(m, n) 行で上書きされます;

jobu jobsvd::vectorsina かつ jobvt jobsvd::vectorsina の場合、a の内容は破棄されます。

s

特異値を含む配列。サイズは max(1, min(m,n)) 以上。s(i) s(i+1) となるようにソートされた A の特異値が含まれます。

u

U を含む配列。jobu = jobsvd::vectors の場合は u の 2 番目の次元は max(1, m) 以上でなければならず、jobu = jobu = job::somevec の場合は max(1, min(m, n)) 以上でなければなりません。

jobu = jobsvd::vectors の場合、u には m 行 m 列の直交/ユニタリー行列 U が含まれます。

jobu = job::somevec の場合、u には U の最初の min(m, n) 列 (列ごとに格納された左特異ベクトル) が含まれます。

jobu = job::novec または jobsvd::vectorsina の場合、u は参照されません。

vt

VT を含む配列。vt の 2 番目の次元は max(1, n) 以上である必要があります。

jobvt = jobsvd::vectors の場合、vt には n 行 n 列の直交/ユニタリー行列 VT/VH が含まれます。

jobvt = job::somevec の場合、vt には VT/VH (行ごとに格納された右特異ベクトル) の最初の min(m, n) 行が含まれます。

jobvt = job::novec または jobsvd::vectorsina の場合、vt は参照されません。

例外#

例外

説明

mkl::lapack::exception

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

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

info = i の場合、bdsqr が収束しなかったときは、i は中間二重対角形式 B のいくつの超対角要素がゼロに収束しなかったかを指定し、scratchpad(2:min(m,n)) には、対角要素が s にある上二重対角行列 B の収束していない超対角要素が含まれます (必ずしもソートされている必要はありません)。BA = U*B*VT を満たすため、A と同じ特異値と、U および VT によって関連付けられた特異ベクトルを持ちます。

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

戻り値#

計算が完了したことを確認するために待機する出力イベント。