关于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?
谢谢
发布于 2016-08-05 21:59:26
这些概念在LAPACK和LAPACKE文档中如此不透明,这真是太糟糕了。供参考:
对于LAPACK_{ROW,COL}_MAJOR:http://www.netlib.org/lapack/lapacke.html#_array_arguments
对于LD参数:http://www.netlib.org/lapack/lug/node116.html
所以,为了回答你的问题:
LAPACKE (LAPACK的C接口)使用LAPACK_{ROW,COL}_MAJOR来确定您传递的内存块(通过C中的指针)是否引用了按主要行(一行的所有内容在下一行之前)或列主要部分(一列的所有内容在下一列之前)组织的内存。还要注意的是,这些概念用row -->“最外层维度”和col -->“最内层维度”来概括(对于多于2D的数组)。
一个补充说明:C使用行主存储,而Fortran使用列主存储。在两个系统之间交谈时,您需要进行翻译,或者乐于使用转置。下面有更多关于这一点的内容。
因此,LAPACK值决定了对内存的解释,但是您仍然需要告诉LAPACK_{ROW,COL}_MAJOR /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代码,则为填充数组常量而输入的数据将以行为主的顺序放入内存中。如果您将数据“原样”传递给LAPACK/E,但是设置了LAPACK_COL_MAJOR,那么您将有效地处理数组转置(如果您设置了适当的int N和int LDA)。
c。列数。这看起来有点令人困惑。为什么是c?好吧,原因之一是,我们已经从int N参数中知道了行数。那么,下一个问题是“为什么这个论点不是叫做nCols,或者类似的东西?”
原因是:我们可能会使用一些比c更大的值来只选择数组的一部分。例如,如果我们让LDA = 2 * c,我们最终将在LAPACK例程中使用“每隔一行”--因为当我们说“按LDA数量前进以获得下一件事”时,事情将等同于向前跳跃并跳过一行。
注意与LAPACK文档术语的相似性:前导维度(LDA中的LD )。
对于以行为主的数据,这本质上回答了这样一个问题:“我需要向前移动多少个元素才能从行i移到行i+1。非标准LDA (即LDA != c)将回答一个略有不同的问题。
如果你有主要的列数据,LDA将需要是r,行数(除非你正在做一些奇特的事情)。这里等价的问题是“我需要向前移动多少个元素才能从col i到col i+1。
发布于 2016-09-09 10:35:20
要进一步返回MrDrFenner:
与3的关系以及lda如何确定1的形状:http://www.netlib.org/utk/forums/netlib/messages/272.html
对于2,这取决于你在做什么。例外情况可能是本征值。
https://stackoverflow.com/questions/34698550
复制相似问题