6

lapack_row_major と lapack_col_major に関して 3 つの質問があります。

1) A = [1,2,3,4,5,6] 次元が 2*3 の場合、lapack_row_major は [ [1,2,3],[4,5,6] ] になるという私の理解は正しいですか? 、一方、lapack_col_major の結果は [ [1,3,5],[2,4,6] ] ?

2) 関数に A を渡したいときに、row_major または col_major のどちらを選択するかは重要ですか?

3) lapack_row_major と lda (配列の主要な次元) はどのように関連していますか? am*n 行列 A を lapack_row_major 形式で関数に渡したい場合、その lda は n ですか? A を lapack_col_major として渡すと、その lda は m ですか?

ありがとう

4

2 に答える 2

9

LAPACK および LAPACKE のドキュメントでこれらの概念が非常に不透明であることは、非常に残念です。参考のため:

LAPACK_{ROW,COL}_MAJOR の場合: http://www.netlib.org/lapack/lapacke.html#_array_arguments

LD 引数の場合: http://www.netlib.org/lapack/lug/node116.html

だから、あなたの質問に答えるために:

  1. 正しい軌道に乗っていますが、もう 1 つの情報 (形状) も必要です。

LAPACK_{ROW,COL}_MAJORLAPACKE (LAPACK への C インターフェイス) によって使用され、(C のポインターを介して) 渡すメモリのブロックが、行優先 (1 つの行のすべてが次の行の前に来る) または列によって編成されたメモリを参照しているかどうかを判断します。メジャー (1 つの列のすべてが次の列の前に来る)。また、これらのアイデアは (2D 配列以上の場合) 行 --> "最も外側の次元" および列 --> "最も内側の次元" で一般化されることに注意してください。

追加の注: C は行優先のストレージを使用し、Fortran は列優先のストレージを使用します。2 つのシステム間で会話するときは、翻訳するか、転置を喜んで行う必要があります。詳細については、以下をご覧ください。

そのため、LAPACK_{ROW,COL}_MAJOR値によってメモリの解釈が決まりますが、(通常int NLAPACK および LAPACKE で呼び出される引数を介して) 形状について LAPACK/E ルーチンに伝える必要があります。

したがって、あなたの A 配列 [1,2,3,4,5,6] (メモリにフラットにリストされた数値のみ)

// interpreted as row-major, 2 rows, (note: LDA=3)
A = [[1,2,3],  // a 2x3 matrix
     [4,5,6]]

// interpreted as row-major, 3 rows (note: LDA=2)
A = [[1,2],    // a 3x2 matrix
     [3,4],
     [5,6]]

// interpreted as col-major, 2 col (note: LDA=3)
A = [[1, 4]    // a (different) 3x2 matrix
     [2, 5]
     [3, 6]]

また、C コードを記述している場合、配列定数を埋めるために入力したデータは行優先順でメモリに配置されることに注意してください。そのデータを「そのまま」LAPACK/E に渡しますが、を設定LAPACK_COL_MAJORすると、効果的に配列の転置を処理することになります (適切なint Nとを設定した場合int LDA)。

  1. はい。上記を参照。

  2. 行優先のデータの単純なケースでは、配列 Arは行と列を持つと解釈されます。はい。列の数。 cLDA = cc

それは少し混乱しているようです。なぜcですか?理由の 1 つは、int Nパラメーターから行数を既に知っていることです。では、次の質問は、「nCols などと呼ばれる引数ではないのはなぜですか」ということです。

その理由は次のとおりcです。配列の一部のみを選択するよりも大きな値を使用することがあります。たとえば、 を許可LDA = 2 * cすると、LAPACK ルーチンで「1 行おきに」使用することLDAなります行。

この概念のより一般的な言い回しは、どれくらい大きな一歩を踏み出す必要があるかということです。-- 「メジャー」(外側) ディメンションのストライド サイズです。LAPACK ドキュメンテーションの用語である先行次元(LDA の LD) との類似性に注意してください。

i行優先のデータでは、これは基本的に次の質問に答えています。「行から行に移動するには、いくつの要素を進める必要がありますかi+1。非標準LDA(つまり、LDA != c) は、わずかに異なる質問に答えます。

col-major データLDAがある場合は、行数である必要がありrます (何か特別なことをしている場合を除きます)。iここでの同等の質問は、「 col からcolに移動するにはいくつの要素を進める必要があるか」ですi+1

于 2016-08-05T13:59:25.707 に答える
0

MrDrFenner をさらに遡るには:

3 に関連して、lda が 1 の形状を決定する方法: http://www.netlib.org/utk/forums/netlib/messages/272.html

2 については、あなたが何をしているかに応じて問題になる可能性があります。例外は、eiganvalues の場合があります。

于 2016-09-09T02:35:20.173 に答える