用lda理解Lapack_row_major和Lapack_col_major

时间:2016-01-09 20:29:04

标签: 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格式的m * n矩阵A传递给函数,那么它的lda是n吗?如果我传递A作为lapack_col_major,那么它的lda是m?

由于

2 个答案:

答案 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

所以,回答你的问题:

  1. 您走在正确的轨道上,但您还需要另一条信息(形状)。
  2. LAPACKE(LAPACK的C接口)使用

    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 Nint LDA)。

    1. 是。见上文。

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

    3. 这看起来有点令人困惑。为什么是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。