Есть некоторый код 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.