gesvda_batch (バッファー・ストライド・バージョン)#
一般行列のバッチに対して切り捨て SVD 因数分解を計算します。このルーチンは、oneapi::mkl::lapack 名前空間に属します。
説明#
このルーチンは、一般行列 Ai のバッチに対して、切り捨て SVD 分解 (またはランクを下げた近似値) を次のように計算します。
Ai = Ui * Si * ViT
ここで、Ui と Vi は直交行列、Si は対角線上に特異値を持つ対角行列です。特異値は非負であり、降順でリストされます。特定の行列の切り捨て SVD では、指定された列数を持つ行列が生成されます。列数は、ユーザーが定義するか、ユーザー定義の許容しきい値を使用して実行時に決定されます。
各行列の近似値は、2つの低ランク行列の積 (例えば、低ランク積) として得ることもできます。
Ai = Pi * Qi
説明:
Pi = Ui * Si, Qi = ViT
行数が列数以上の場合、
Pi = Ui, Qi = Si` *ViT
それ以外の場合。
このルーチンは、切り捨て SVD を計算する 3 つの方法を提供します。
入力配列
rankを使用して切り捨て SVD を計算します。rank[i]は、各行列Ai のパラメーターUi、Vi、Si で計算される特異値とベクトルの数を指定します。許容されるしきい値を使用して切り捨て SVD を計算します。SVD を計算する際、ユーザー定義の許容値より小さい特異値はゼロとして扱われ、ゼロに設定されます。
有効ランクを使用して切り捨て SVD を計算します。有効ランクは、ユーザー定義の許容されるしきい値と最大特異値の積よりも小さい特異値をゼロとして扱うことによって決定されます。
このルーチンは特異値のみを計算する場合にも使用できます。
API#
構文#
namespace oneapi::mkl::lapack {
void gesvda_batch(sycl::queue &queue,
sycl::buffer<int64_t> &iparm,
sycl::buffer<int64_t> &irank,
int64_t m,
int64_t n,
sycl::buffer<T> &a,
int64_t lda,
int64_t stride_a,
sycl::buffer<RealT> &s,
int64_t stride_s,
sycl::buffer<T> &u,
int64_t ldu,
int64_t stride_u,
sycl::buffer<T> &vt,
int64_t ldvt,
int64_t stride_vt,
RealT tolerance,
sycl::buffer<T> &residual,
int64_t batch_size,
sycl::buffer<T> &scratchpad, int64_t scratchpad_size)
}gesvda_batch は次の精度とデバイスをサポートしています。
T |
デバイスサポート |
|---|---|
|
CPU、GPU* |
|
CPU、GPU* |
|
CPU、GPU* |
|
CPU、GPU* |
*インターフェイスのサポートのみ。すべての計算は CPU 上で実行されます。
入力パラメーター#
- queue
計算が実行されるデバイスキュー。
- iparm
切り捨て SVD を計算するオプションを指定する 16 次元の配列。また、返される SVD 分解形式のタイプも指定します。以下の表では、
iparmパラメーターの個々のコンポーネントをすべて説明しています。デフォルト値はアスタリスク (*) で示されます。注:iparm[4]-iparm[15]は将来のために予約されています。
コンポーネントの説明 |
値 |
|---|---|
|
|
|
|
|
が計算されます。
が計算されます。 |
|
|
- irank
iparm[0]=0またはiparm[0]=-1の場合、要素irank[i]は、各行列Ai についてUi,ViT およびSi で計算される特異値および/または特異ベクトルの数を指定します。- m
行列
Ai の行数 。- n
行列
Ai の列数 。- a
入力行列
Ai を保持する配列。- lda
a の先頭次元;
max(1, m)以上である必要があります。- stride_a
バッチ配列 a 内の行列
Ai の先頭間のストライド。max(1, lda * n)以上である必要があります。- stride_s
配列 s 内の行列
Si の先頭間のストライド。min(m,n)以上である必要があります。- ldu
Ui の先頭次元;max(1, m)以上である必要があります。- stride_u
バッチ配列 u 内の行列
Ui の先頭間のストライド。max(1, ldu * m)以上である必要があります。- ldvt
ViT の先頭次元。max(1, n)以上である必要があります。- stride_vt
バッチ配列
ViT 内の行列 vt の先頭間のストライド。max(1, ldvt * n)以上である必要があります。- tolerance
許容されるしきい値を指定します。これは、
iparm[0]=1およびiparm[0]=2の場合にのみ、切り捨て SVD の計算に使用されます。それ以外では使用されません。- batch_size
バッチ内の問題数。
- scratchpad
ルーチンが中間結果を保存するスクラッチパッド・メモリー。
- scratchpad_size
T タイプの浮動小数点要素数のスクラッチパッド・メモリーのサイズ。サイズは、gesvda_batch_scratchpad_size (ストライドバージョン) 関数が返す値よりも小さくてはなりません。
出力パラメーター#
- irank
iparm[0]=-1またはiparm[0]=0の場合、要素irank[i]は行列Ai の計算された特異値および/または特異ベクトルの数です。- a
残差ベクトルが不要な場合、終了時に変更されません。それ以外の場合は残差行列を含みます
iparm[2]=0の場合、Ai -Ui *Si *ViT で、iparm[2]=1の場合、Ai -Pi *Qi。- s
特異値
Si のバッチを格納するサイズmin(m,n)*batch_sizeの配列。- u
u は、
iparm[2]=0の場合はUi のバッチを格納し、iparm[2]=1の場合はPi のバッチを格納する、stride_u*batch_size以上のサイズの配列です。- vt
vt は、
iparm[2]=0の場合はViT のバッチを格納し、iparm[2]=1の場合はQi のバッチを格納する、stride_vt*batch_size以上のサイズの配列です。- residual
batch_size次元の配列。iparm[3]=1の場合、residual[i]は行列のフロベニウス・ノルムです:||
Ai -Ui *Si *ViT ||iparm[2]=0の場合、および||
Ai -Pi *Qi ||iparm[2]=1の場合。
例外#
例外 |
説明 |
|---|---|
|
この例外は、計算中に問題が発生した場合にスローされます。例外オブジェクトの info() メソッドを使用して、問題の情報コードを取得できます。
|