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 つの情報 (形状) も必要です。
LAPACK_{ROW,COL}_MAJOR
LAPACKE (LAPACK への C インターフェイス) によって使用され、(C のポインターを介して) 渡すメモリのブロックが、行優先 (1 つの行のすべてが次の行の前に来る) または列によって編成されたメモリを参照しているかどうかを判断します。メジャー (1 つの列のすべてが次の列の前に来る)。また、これらのアイデアは (2D 配列以上の場合) 行 --> "最も外側の次元" および列 --> "最も内側の次元" で一般化されることに注意してください。
追加の注: C は行優先のストレージを使用し、Fortran は列優先のストレージを使用します。2 つのシステム間で会話するときは、翻訳するか、転置を喜んで行う必要があります。詳細については、以下をご覧ください。
そのため、LAPACK_{ROW,COL}_MAJOR
値によってメモリの解釈が決まりますが、(通常int N
LAPACK および 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
)。
はい。上記を参照。
行優先のデータの単純なケースでは、配列 Ar
は行と列を持つと解釈されます。はい。列の数。 c
LDA = c
c
それは少し混乱しているようです。なぜ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
。