用lda理解Lapack_row_major和Lapack_col_major

Min*_*ina 4 lapack lapacke

我有三个关于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是否为n?如果我传递A作为lapack_col_major,那么它的lda是m?

谢谢

MrD*_*ner 5

这些概念在LAPACK和LAPACKE文档中是如此不透明,实在太糟糕了.以供参考:

对于LAPACK_ {ROW,COL} _MAJOR:http://www.netlib.org/lapack/lapacke.html#_array_arguments

对于LD args:http: //www.netlib.org/lapack/lug/node116.html

那么,回答你的问题:

  1. 您走在正确的轨道上,但您还需要另一条信息(形状).

LAPACK_{ROW,COL}_MAJORLAPACKE(LAPACK的C接口)使用它来确定您传递的内存块(通过C中的指针)是否引用按行主要组织的内存(所有一行都在下一行之前)或列major(所有一列都在下一列之前).还要注意,这些想法概括(不仅仅是2D数组),包括row - >"outer most dimension"和col - >"inner most dimension".

一个补充说明:C使用行主存储,Fortran使用col-major存储.在两个系统之间进行交谈时,您需要翻译或乐意使用转置.更多关于以下内容.

因此,该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]]
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您正在编写C代码,则输入以填充数组常量的数据将按行主顺序放入内存中.如果您将该数据"按原样"传递给LAPACK/E,但是设置LAPACK_COL_MAJOR,您将有效地使用数组的转置(如果您设置了相应的int Nint LDA).

  1. 是.往上看.

  2. 在行主数据的简单情况下,数组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行数(除非你做的事情很花哨).这里的等价问题是"我需要多少元素才能从col i到col i+1.