2016-01-09 6 views
3

У меня есть три вопроса, касающегося lapack_row_major и lapack_col_major:понимания Lapack_row_major и Lapack_col_major с LDA

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) Имеет ли значение какой из row_major или col_major я выбираю, когда хочу передать A функции?

3) как связаны lapack_row_major и lda (ведущее измерение массива)? Верно ли, что если я хочу передать m * n-матрицу A в формате lapack_row_major в функцию, то ее lda будет n? и если я передам A как lapack_col_major, тогда его lda будет m?

Благодаря

ответ

4

Это действительно очень плохо, что эти понятия настолько непрозрачны, в документации LAPACK и LAPACKE. Для справки:

Для LAPACK_ {ROW, COL} _MAJOR: http://www.netlib.org/lapack/lapacke.html#_array_arguments

Для LD аргументах: http://www.netlib.org/lapack/lug/node116.html

Таким образом, чтобы ответить на ваши вопросы:

  1. Вы на правильном пути , но вам также нужна еще одна информация (форма).

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).

  1. Да. См. Выше.

  2. В простом случае с строками из основных данных, с массивом интерпретируется как имеющий 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.

0

Для дальнейшего назад MrDrFenner:

По отношению к 3 и как Lda может определить форму 1: http://www.netlib.org/utk/forums/netlib/messages/272.html

Для 2 это может иметь значение в зависимости от того, что вы делаете. Исключение может быть eiganvalues.