我有三个关于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格式的m * n矩阵A传递给函数,那么它的lda是n吗?如果我传递A作为lapack_col_major,那么它的lda是m?
由于
答案 0 :(得分: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
所以,回答你的问题:
LAPACK_{ROW,COL}_MAJOR
来确定您传递的内存块(通过C中的指针)是否引用按行主要组织的内存(全部为一行)在下一行之前)或列专业(所有一列都在下一列之前)。另请注意,这些想法概括(对于超过2D数组)的行 - > "最外层尺寸"和col - > "最内层的维度"。
一个补充说明:C使用行主存储,Fortran使用col-major存储。在两个系统之间进行交谈时,您需要翻译或乐意使用转置。更多关于以下内容。
因此,LAPACK_{ROW,COL}_MAJOR
值决定了内存的解释,但你仍然需要告诉LAPACK / E例程关于形状(通过LAPACK和LAPACKE中通常称为int N
的参数)。
所以,你的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代码,则输入以填充数组常量的数据将按行主顺序放入内存中。如果您传递该数据"按原样#34;到LAPACK / E,但设置LAPACK_COL_MAJOR
,您将有效地使用数组的转置(如果您设置了相应的int N
和int LDA
)。
是。见上文。
在行主数据的简单情况下,数组A被解释为具有r
行和c
列,LDA = c
。是的,c
。列数。
这看起来有点令人困惑。为什么是c
?好吧,出于一个原因,我们已经知道int N
参数的行数。所以,下一个问题是"为什么不是那个叫nCols的论点,或者其他一些"?
原因是:我们可能会使用一些大于c
的值来仅选择部分数组。例如,如果我们让LDA = 2 * c
,我们最终会使用"每隔一行"在LAPACK例程中 - 因为当我们说"前进LDA
金额以进入下一个事物", thing 相当于向前跳跃并跳过一排。
这个概念的一个更常见的措辞 - 我们需要采取多大步骤? - 是" major"中的步幅大小。 (外部)维度。请注意与LAPACK文档术语的相似性:前导维度(LDA中的LD)。
对于行主要数据,这基本上回答了问题:"我需要多少元素才能从行i
到行i+1
前进。非标准的LDA
(即LDA != c
)会回答一个稍微不同的问题。
如果你有col-major数据,LDA
将需要r
,行数(除非你做了一些奇特的事情)。这里的等价问题是"我需要多少元素才能从col i
转到col i+1
。
答案 1 :(得分:0)
进一步支持MrDrFenner:
关于3以及lda如何确定1的形状: http://www.netlib.org/utk/forums/netlib/messages/272.html
对于2来说,这取决于你在做什么。例外情况可能是eiganvalues。