我有三个关于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?
谢谢
这些概念在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}_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 N和int LDA).
是.往上看.
在行主数据的简单情况下,数组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.
| 归档时间: |
|
| 查看次数: |
1711 次 |
| 最近记录: |