Подробности формата разреженной матрицы "Новый Йель"? - PullRequest
2 голосов
/ 09 февраля 2012

Есть некоторый код Netlib, написанный на Фортране, который выполняет транспонирование и умножение на разреженные матрицы. Библиотека работает с форматами Bank-Smith (вроде), "старый Йельский университет" и "новый Йельский университет".

К сожалению, я не смог найти подробностей о "новом Йельском университете". Я реализовал то, что, как мне кажется, соответствует описанию , приведенному в статье , и я могу получать и устанавливать записи соответствующим образом.

Но результаты не верны, что заставляет меня задуматься, реализовал ли я что-то, совпадающее с описанием в статье, но не то, что ожидает код на Фортране.

Итак пара вопросов:

Должны ли длины строк включать диагональные элементы? Например, если у вас есть M=[1,1;0,1], похоже, это должно выглядеть так:

IJA = [3,4,4,1]
A   = [1,1,X,1] // where X=NULL

Кажется, что если диагональные элементы включены в длину строк, вы получите что-то вроде этого:

IJA = [3,5,6,1]
A   = [1,1,X,1]

Это не имеет особого смысла, потому что IJA[2]=6 должно быть размером массивов IJA / A, но оно равно тому, что, как кажется, говорится в статье.

Должны ли матрицы использовать индексирование на основе 1?

В конце концов, это код Фортрана. Возможно, вместо этого мои IJA и A должны выглядеть так:

IJA = [4,5,5,2]
A   = [1,1,X,1] // still X=NULL

Что-то еще мне не хватает?

Да, это расплывчато, но я добавлю это на тот случай, если кто-то, кто испортил этот код раньше, хотел бы предоставить какую-либо дополнительную информацию. Любой другой может не стесняться игнорировать этот последний вопрос.

Я знаю, что эти вопросы могут показаться довольно тривиальными, но я подумал, что, возможно, некоторые люди из Фортрана могли бы дать мне некоторое представление. Я не привык думать в единой системе, и хотя я преобразовал код в C, используя f2c, он все еще написан как Fortran.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Я не вижу, как вы вывели эти векторы из этой статьи.Сначала формат Old Yale:

M = [7,16;0,-12]

Затем A содержит все ненулевые значения M в виде строки: A = [7,16, -12]

иIA сохраняет положение в A первых элементов каждой строки, а JA сохраняет индексы столбцов всех значений в A:

IA = [1,3,4]
JA = [1,2,2]

Новый формат: Aсначала имеет диагональные значения, ноль, а затем остальные ненулевые элементы (я указал |, чтобы прояснить разделение между диагональю и недиагональю):

A = [7,-12,0 | 16]

IA и JAобъединены в IJA, но, насколько я могу судить из статьи, вам необходимо принять во внимание новый порядок A (я поставил |, чтобы прояснить разделение между IA и JA):

IJA = [1,2,3 | 2]

Итак, применительно к вашему делу M = [1,1;0,1], я получаю

A   = [1,1,0 | 1]
IJA = [1,2,3 | 2]

первый элемент первого ряда - первый в A и первый элемент второго рядавторой в A, тогда я ставлю 3, так как они говорят, что длина строки определяется IA(I)-IA(I+1), поэтому я проверяю разницуэто 1.Затем следуют индексы столбцов ненулевых недиагональных элементов, и это 2.

2 голосов
/ 09 февраля 2012

Итак, во-первых, ссылка, приведенная в SMMP-документе , возможно, не является правильной. Я проверил это (ссылка) из библиотеки прошлой ночью. Похоже, чтобы дать "старый Йельский" формат. На стр. 49-50 упоминается, что диагональ может быть отделена от остальной части матрицы, но не так много, как упоминание вектора IJA.

Мне удалось найти формат, описанный в издании 1992 года Числовые рецепты на C на стр. 78-79.

Конечно, нет гарантии, что этот формат принят библиотекой SMMP от Netlib.

NR похоже, что IA дает позиции относительно IJA, а не относительно JA. Последняя позиция в части IA дает не размер векторов IJA и A, а size-1, потому что векторы индексируются начиная с 1 (по стандарту Fortran).

Длина строк не включает ненулевые диагональные записи.

...