Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Interop] Matlab+Fortran 
V
    Опции темы
popovda
Дата 9.12.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: нет
Всего: 6



Кто-нибудь имеет опыт создание MEX-функций на Fortran'е. На C/C++ я их писал, а на Ф. что-то не пашет.
М.б. у кого-нибудь есть код "пустышки", компилируемый без ошибок. Обращаюсь к Вам, т.к. у меня в Matlab help урезаный. 


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
popovda
Дата 11.12.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: нет
Всего: 6



Вопрос снимается. Это делается так (и под Linux, и под Windows).
1. Если вы не пользуетесь лицензионным NAG Fortran 95 5.1 for Linux с NAG-пакетом взаимодействия  с MATLAB, то надо создать файл с интерфейсами API-функций Matlab'а. 

Код

module mexf90
         interface

                function mxGetPr(pm)  
                      integer, pointer :: mxGetPr;
                      integer :: pm;
                end function mxGetPr;

                function mxGetPi(pm)  
                      integer, pointer :: mxGetPi;
                      integer :: pm;
                end function mxGetPi;

                integer function mxGetM(pm)  
                      integer :: pm;
                end function mxGetM;

                integer function mxGetN(pm)  
                      integer :: pm;
                end function mxGetN;

               integer function mxCreateDoubleMatrix(m,n,type)
                      integer :: m,n,type;
               end function mxCreateDoubleMatrix;

               real(8) function mxGetScalar(pm)
                      integer :: pm;
               end function mxGetScalar;
        end interface;
end module mexf90


Вот этот интерфейсный модуль мы компилируем и подключаем к mex-файлу, из которого и получится
.dll или. so - в общем динамическая библиотека.

Теперь mex-файл, ну там вся логика как на C:

Код

! Имя mexFunction - это точка входа в библиотеку.    
        subroutine mexFunction(nlhs, plhs, nrhs, prhs)
                use mexf90;

                implicit none;
                
                integer, intent(in) :: nlhs, nrhs;
                integer, intent(in) , dimension(*) :: prhs; ! В матлабе все данные - массивы, даже скаляры
                integer, intent(out), dimension(*) :: plhs;! по сути  prhs - массив вх. параметров, plhs - выходных     
                ! Ну а тут уже идет код, который мы пишем сами
                .......................
                ! Например получить количество строк матрицы - первого входного параметра можно так
                m =  mxGetM(prhs(1));
                ........................
       end subroutine mexFunction;


Это сообщение отредактировал(а) popovda - 11.12.2006, 14:58


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0382 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.