Понимание Lapack_row_major и Lapack_col_major с lda

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

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

Спасибо

3 ответа

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

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

Для LD args: http://www.netlib.org/lapack/lug/node116.html

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

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

LAPACK_{ROW,COL}_MAJOR используется LAPACKE (интерфейс C к LAPACK), чтобы определить, ссылается ли блок памяти, который вы передаете (через указатель в C) на память, которая организована по главному ряду (все из одной строки идут перед следующей строкой) или по столбцу Major (все из одного столбца предшествуют следующему столбцу). Также обратите внимание, что эти идеи обобщаются (для более чем двухмерных массивов) со строками -> "самое большое измерение" и col -> "самое внутреннее измерение".

Одно добавленное примечание: C использует хранилище с основными рядами, а Fortran использует хранилище с основными рядами. Когда вы разговариваете между двумя системами, вам нужно либо переводить, либо радоваться работе с транспонированием. Подробнее об этом ниже.

Итак 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]]

Также обратите внимание, что если вы пишете код на C, данные, которые вы вводите для заполнения константы массива, будут помещены в память в порядке следования строк. Если вы передадите эти данные "как есть" в LAPACK/E, но установите LAPACK_COL_MAJORвы будете эффективно работать с транспонированием массива (если вы установите соответствующий int N а также int LDA).

  1. Да. Смотри выше.

  2. В простом случае с основными данными строки с массивом A интерпретируется как имеющий r строки и c перевалы, LDA = c, Да, c, Количество столбцов.

Это кажется немного запутанным. Почему это c? Ну, по одной причине, мы уже знаем количество строк из int N параметр. Итак, следующий вопрос: "Почему аргумент не называется просто nCols или чем-то подобным"?

Причина заключается в следующем: мы могли бы использовать какое-то значение больше, чем c выбрать только часть массива. Например, если мы позволим LDA = 2 * cмы бы в конечном итоге использовали "каждый второй ряд" в подпрограмме LAPACK - потому что когда мы говорим "идти вперед LDA сумма, чтобы добраться до следующей вещи", вещь будет эквивалентна прыжку вперед и пропуску строки.

Более распространенная формулировка для этой концепции - какой большой шаг нам нужно сделать? - размер шага в "главном" (внешнем) измерении. Обратите внимание на сходство с термином документации LAPACK: ведущее измерение (LD в LDA).

С основными данными строки это по существу отвечает на вопрос: "Сколько элементов мне нужно, чтобы двигаться вперед, чтобы получить строку? i грести i+1, Нестандартный LDA (То есть, LDA != c) ответит немного на другой вопрос.

Если у вас есть основные данные, LDA нужно будет rколичество строк (если вы не делаете что-то причудливое). Эквивалентный вопрос здесь: "Сколько элементов мне нужно, чтобы двигаться вперед, чтобы получить i на кол i+1,

Для дальнейшей поддержки MrDrFenner:

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

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

Ох, эти два понятия немного сбивают с толку. Здесь основная теория заключается в том, как массив хранится в памяти для кода C.
Например,
компилятор int a[10][10], c использует одномерный массив для хранения двухмерного массива.

lapacke, который представляет собой интерфейс c, использует одно измерение для перехвата матрицы. Итак, вы можете подсчитывать элементы в таблице по одной строке за одной строкой или по одному столбцу за одним столбцом. LDA — это количество элементов, которые можно посчитать в одной строке. Таким образом, lda соответствует/определяет элементы в одной строке для LAPACK_ROW_MAJOR.
Элементы в одном столбце для LAPACK_COL_MAJOR.

Другие вопросы по тегам