Это действительно очень плохо, что эти понятия настолько непрозрачны, в документации LAPACK и LAPACKE. Для справки:
Для LAPACK_ {ROW, COL} _MAJOR: http://www.netlib.org/lapack/lapacke.html#_array_arguments
Для LD аргументах: http://www.netlib.org/lapack/lug/node116.html
Таким образом, чтобы ответить на ваши вопросы:
- Вы на правильном пути , но вам также нужна еще одна информация (форма).
LAPACK_{ROW,COL}_MAJOR
используется LAPACKE (интерфейс C для LAPACK), чтобы определить, является ли блок памяти, который вы передаете (через указатель в C) ссылается память, которая организована по ряду крупных (все из одной строки приходит перед следующей строкой) или майором столбца (весь столбец находится перед следующим столбцом). Также обратите внимание, что эти идеи обобщают (для более чем 2D-массивов) со строкой -> «внешняя большая размерность» и col -> «внутренняя большая размерность».
Одно добавленное примечание: C использует хранилище строк и Fortran использует хранилище col-major. Когда вы говорите между двумя системами, вам нужно либо перевести, либо быть счастливым, работая с транспозицией. Подробнее об этом ниже.
Таким образом, значение LAPACK_{ROW,COL}_MAJOR
определяет интерпретацию памяти, но вам все равно нужно рассказать процедуры LAPACK/E о форме (через аргумент, обычно называемый в LAPACK и LAPACKE).
Таким образом, ваш массив [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, но установите , вы эффективно будете работать с транспонированием массива (если вы установите соответствующие и int LDA
).
Да. См. Выше.
В простом случае с строками из основных данных, с массивом интерпретируется как имеющий r
строк и c
COLS, LDA = c
. Да, c
. Число столбцов.
Это кажется немного запутанным. Почему это c
? Ну, по одной причине мы уже знаем количество строк из параметра int N
. Итак, следующий вопрос: «Почему это не аргумент, который просто называется nCols, или какой-то такой»?
Причина такова: мы можем использовать некоторое значение, превышающее c
, чтобы выбрать только часть массива. Например, если мы допустим LDA = 2 * c
, мы будем использовать «каждую другую строку» в рутине LAPACK, потому что, когда мы говорим «идем вперед на LDA
сумма, чтобы перейти к следующей вещь», вещь будет эквивалентной прыгать вперед и пропустить ряд.
Более распространенная фраза для этой концепции - какой большой шаг нам нужно предпринять? - размер шага в «основном» (внешнем) размере. Обратите внимание на сходство с документом LAPACK: ведущий размер (LD в LDA).
С рядных-мажорных данных, это, по существу, отвечая на вопрос:. «Сколько элементов мне нужно сделать, чтобы двигаться вперед, чтобы получить из строки i
грести i+1
Нестандартные LDA
(т.е. LDA != c
) будет ответить на несколько другой вопрос.
Если у вас есть Col-мажорные данные, LDA
должны быть r
, количество строк (если вы не делаете что-то фантазия). эквивалентный вопрос здесь «, сколько элементов нужно ли мне двигаться вперед для получения от col i
до col i+1
.