这些概念在 LAPACK 和 LAPACKE 文档中如此不透明,真是太糟糕了。以供参考:
对于 LAPACK_{ROW,COL}_MAJOR: http: //www.netlib.org/lapack/lapacke.html#_array_arguments
对于 LD 参数:
http: //www.netlib.org/lapack/lug/node116.html
所以,回答你的问题:
- 您走在正确的轨道上,但您还需要另一条信息(形状)。
LAPACK_{ROW,COL}_MAJOR
LAPACKE(LAPACK 的 C 接口)使用它来确定您正在传递的内存块(通过 C 中的指针)是否正在引用按行主要(所有一行都在下一行之前)或列组织的内存主要(所有一列都在下一列之前)。另请注意,这些想法泛化(对于超过 2D 数组)行 -->“最外层”和 col -->“最内层”。
补充一点:C 使用行优先存储,而 Fortran 使用列优先存储。在两个系统之间进行交流时,您需要翻译或乐于使用转置。更多关于下面的内容。
因此,LAPACK_{ROW,COL}_MAJOR
值决定了内存的解释,但您仍然必须告诉 LAPACK/E 例程有关形状的信息(通过通常int N
在 LAPACK 和 LAPACKE 中调用的参数)。
所以,你的 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,但 set LAPACK_COL_MAJOR
,您将有效地处理数组的转置(如果您设置了适当的int N
and int LDA
)。
是的。看上面。
在具有行主要数据的简单情况下,数组 A 被解释为具有r
行和列c
,LDA = c
. 是的,c
。列数。
这似乎有点令人困惑。为什么呢c
?int N
好吧,出于一个原因,我们已经从参数中知道了行数。那么,下一个问题是“为什么不把它称为 nCols 之类的论点”?
原因是这样的:我们可能会使用比c
只选择数组的一部分更大的值。例如,如果我们让LDA = 2 * c
,我们最终会在 LAPACK 例程中使用“每隔一行”——因为当我们说“按LDA
数量前进以到达下一件事”时,事情就相当于向前跳并跳过一个排。
这个概念的一个更常见的措辞——我们需要迈出多大的一步?-- 是“主要”(外部)维度中的步幅。请注意与 LAPACK 文档术语的相似之处:前导维度(LDA 中的 LD)。
对于以行为主的数据,这基本上是在回答这个问题:“我需要向前移动多少元素才能从一行i
到另一行i+1
。非标准LDA
(即LDA != c
)将回答一个略有不同的问题。
如果您有 col-major 数据,LDA
则需要是r
行数(除非您正在做一些花哨的事情)。这里的等效问题是“我需要向前移动多少元素才能从 coli
到 col i+1
。