Я пытаюсь написать драйвер на C++ для вычисления собственных значений для асимметричной разрешающей матрицы с реальными значениями, используя функции fortran, предлагаемые ARPACK, но у меня есть немного проблема с обратным коммуникационным подходом.Вызов ретрансляционной программы ARPACK с обратным сообщением
Вообще, я пытаюсь решить нормальное собственное уравнение:
A*v = lambda*v
и любое взаимодействие с матрицей А делается в ARPACK с помощью функции «ау»:
av(n, workd[ipntr[0]], workd[ipntr[1]])
, который умножает вектор, удерживаемый в массиве «workd», начинающийся с местоположения «ipntr [0]», и вставляет результат в массив «workd», начинающийся с местоположения «ipntr [1]». Примеры такого подхода приведены в руководстве по адресу http://www.caam.rice.edu/software/ARPACK/, а также в коде ARPACK/ПРИМЕР/ПРОСТО/dnsimp.f.
Что я хотел бы знать, так это как я могу связать матрицу A? Если он не передается в подпрограмму, то как можно найти его действие на предоставленном векторе?
В примере кода dnsimp.f их матрица A вычисляется внутри функции 'av' и является «полученной из стандартной центральной дискретизации развязки двумерного оператора конвекции-диффузии». Однако, я считаю, что это проблема конкретной? Также не кажется слишком полезным кодировать вывод матрицы A в функцию. Я не могу найти много информации об этом из руководства.
Это, кажется, не слишком большая проблема, поскольку поскольку это определенная пользователем функция, я могу просто изменить определение «av», чтобы включить матрицу A в качестве параметра. Однако я хотел бы знать, как это делается правильно в случае каких-либо потенциальных проблем совместимости.
Спасибо!
Я понимаю, что ARPACK не нуждается в матрице напрямую, мне было интересно, как функция «av», которая обрабатывает секцию обратной связи, фактически обращается к матрице A, чтобы выполнить вектор-матричный продукт.Не передавая его функции (и, следовательно, меняя предложенный формат объявления), единственный способ увидеть ее работу - объявить A как глобальную переменную. Изменение деклараций подходит для моего личного использования, хотя мне было любопытно узнать, есть ли лучший способ, который мог бы быть совместим с другим кодом, который использует их метод. – user3023621
Приношу свои извинения, я, вероятно, очень не совсем понимаю это! Моя проблема не является основным алгоритмом, но в действительности получает матрицу А в мою «любимую процедуру». В примерах их любимая процедура - это функция 'av', которая определена выше, и A была закодирована в функцию (не идеальна). Как вы говорите, матрица A необходима для вычисления произведения, но вопрос в том, как использовать матрицу A, если она не передается как параметр в «av». Я думаю, что глобальная переменная будет работать, но я просто буду придерживаться изменения объявления. Спасибо за вашу помощь! – user3023621
Хорошо, я тоже должен извиниться ... Теперь, я понимаю, что вы имеете в виду. Они определили матрично-векторное произведение для своей примерной матрицы как можно короче. Вот почему, почему это не выглядит явно. Обычно вы заменяете эту подпрограмму, которая является * NOT * частью библиотеки ARPACK (но только примером) с подпрограммой, которая умножает * YOUR * -матрицу с возвращенными векторами. – Stefan