6

我对 lapack_row_major 和 lapack_col_major 有三个问题:

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(数组的前导维度)有什么关系?如果我想将 lapack_row_major 格式的 am*n 矩阵 A 传递给一个函数,那么它的 lda 是真的吗?如果我将 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. 您走在正确的轨道上,但您还需要另一条信息(形状)。

LAPACK_{ROW,COL}_MAJORLAPACKE(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 Nand int LDA)。

  1. 是的。看上面。

  2. 在具有行主要数据的简单情况下,数组 A 被解释为具有r行和列cLDA = c. 是的,c。列数。

这似乎有点令人困惑。为什么呢cint 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

于 2016-08-05T13:59:25.707 回答
0

进一步支持 MrDrFenner:

关于 3 以及 lda 如何确定 1 的形状:http: //www.netlib.org/utk/forums/netlib/messages/272.html

对于 2,这取决于你在做什么。例外可能是特征值。

于 2016-09-09T02:35:20.173 回答