Один MEX-файл для управления всеми функциями и в DLL для их привязки - PullRequest
1 голос
/ 03 мая 2019

Я использовал Intel Fortran для компиляции MEX-файлов для использования в MATLAB.(MEX-файлы - это код экспонирования dll, в моем случае это функция fortran, для MATLAB.) С каждой функцией Fortran, которую я хотел открыть для MATLAB, был связан один MEX-файл.Изначально я делал это в командной строке и хотел перейти в визуальную студию.Пример Visual Studio для одной функции находится здесь .

Поскольку у меня довольно много функций, я не хотел бы создавать один проект Visual Studio для каждой функции, и я бы предпочелесть один MEX-файл DLL, содержащий все функции Fortran, которые я хотел бы экспортировать в MATLAB.Можно ли это сделать, и если да, то как?

1 Ответ

2 голосов
/ 03 мая 2019

В MATLAB каждый MEX-файл реализует одну функцию MATLAB.Однако вы можете написать свою функцию MEX-файла так, чтобы она принимала в качестве первого аргумента строку, которая указывает, какую из ваших функций Fortran вы хотели бы вызвать.Например, у вас будет команда:

out = my_mex_gate('function1', arg1, arg2);

Если вам не нравится синтаксис (я не удивлюсь), поместите этот MEX-файл в подкаталог с именем privateтакой, что он недоступен извне каталога, и напишите функции M-файла, которые вызывают ваши личные MEX-файлы:

function out = function1(arg1,arg2)
   out = my_mex_gate('function1',arg1,arg2);

Вам все еще нужно написать один M-файл для каждой функции, которую вы хотитевыставлять.Но поскольку эти M-файлы должны содержать также документацию для каждой функции, эти файлы полезны не только для упрощения синтаксиса.

Ваша структура каталогов будет выглядеть следующим образом:

  Ftoolbox/
     +- function1.m
     +- function2.m
     +- function3.m
     +- private/
           +- my_mex_gate.mex

Выберите осмысленное имявместо Ftoolbox.Затем вы добавляете этот каталог в путь к MATLAB:

addpath /path/to/Ftoolbox

, делая все эти функции доступными в MATLAB, независимо от текущего каталога.


Внутри MEX-файлаточка входа (mexFunction) проверяет только первый входной аргумент.Исходя из его значения, он будет вызывать одну из ряда внутренних функций.Каждый из этих проверяет и преобразует остальные входные аргументы и вызывает соответствующую функцию Fortran.Эти функции более или менее похожи на индивидуальные mexFunction s.Следовательно, для различных функций Fortran не требуется иметь одинаковые наборы входных аргументов.

Это пример такого MEX-файла в C ++ , в Fortran вы можете сделать точното же самое.

...