Spec-Zone.ru › Octave 5

A.2.1 Начало работы с Mex-файлами

Основная команда для создания mex-файла — это либо mkoctfile --mex либо mex. Первую команду можно использовать как изнутри Octave, так и из командной строки. Чтобы избежать проблем с собственным mex команд MATLAB, использование команды mex ограничено использованием внутри Octave. Скомпилированные mex-файлы имеют расширение .mex.

mex [options] file …

Компилирует исходный код на C, C++ или Fortran в MEX-файл.

Это эквивалентно mkoctfile --mex [options] file.

См. также: mkoctfile, mexext.

mexext ()

Возвращает расширение имени файла, используемое для MEX-файлов.

См. также: mex.

Рассмотрим следующий короткий пример:

#include "mex.h"

void
mexFunction (int nlhs, mxArray *plhs[],
             int nrhs, const mxArray *prhs[])
{
  mexPrintf ("Hello, World!\n");

  mexPrintf ("I have %d inputs and %d outputs\n", nrhs, nlhs);

  /* Return empty matrices for any outputs */
  int i;
  for (i = 0; i < nlhs; i++)
    plhs[i] = mxCreateDoubleMatrix (0, 0, mxREAL);
}

Первая строка #include "mex.h" делает доступными все необходимые определения для mex-файла. Важное отличие между Octave и MATLAB заключается в том, что заголовочный файл "matrix.h" неявно включается через включение "mex.h". Это необходимо для предотвращения конфликта с файлом Octave "Matrix.h" для операционных систем и компиляторов, которые не различают имена файлов в верхнем и нижнем регистре.

Точка входа в mex-файл определена mexFunction. Функция принимает четыре аргумента:

  1. Количество возвращаемых аргументов (# аргументов слева).
  2. Массив указателей на возвращаемые аргументы.
  3. Количество входных аргументов (# аргументов справа).
  4. Массив указателей на входные аргументы.

Обратите внимание, что определение имени функции не явно включено в mexFunction и поэтому может быть только один mexFunction точка входа в файл. Вместо этого имя функции, как видно в Octave, определяется именем самого mex-файла без расширения. Если указанная выше функция находится в файле myhello.c, её можно скомпилировать с помощью

mkoctfile --mex myhello.c

что создаёт файл myhello.mex. Функцию затем можно запустить из Octave как

myhello (1,2,3)
⇒ Hello, World!
⇒ I have 3 inputs and 0 outputs

Следует отметить, что mex-файл не содержит строки справки. Для документирования mex-файлов должен существовать m-файл в той же директории, что и сам mex-файл. Принимая вышесказанное в качестве примера, должен существовать файл myhello.m, который может содержать текст

%MYHELLO Simple test of the functionality of a mex-file.

В этом случае функция, которая будет выполняться внутри Octave, будет определена mex-файлом, а строка справки — m-файлом. Это также может быть полезно для предоставления примерной реализации mex-файла в самом языке Octave для целей тестирования.

Хотя в одном mex-файле не может быть нескольких точек входа, можно использовать функцию mexFunctionName для определения имени, с которым был вызван mex-файл. Это можно использовать для изменения поведения mex-файла на основе имени функции. Например, если

#include "mex.h"

void
mexFunction (int nlhs, mxArray *plhs[],
             int nrhs, const mxArray *prhs[])
{
  const char *nm;

  nm = mexFunctionName ();
  mexPrintf ("You called function: %s\n", nm);
  if (strcmp (nm, "myfunc") == 0)
    mexPrintf ("This is the principal function\n", nm);

  return;
}

находится в файле myfunc.c и скомпилирована с помощью

mkoctfile --mex myfunc.c
ln -s myfunc.mex myfunc2.mex

то, как видно из

myfunc ()
⇒ You called function: myfunc
    This is the principal function
myfunc2 ()
⇒ You called function: myfunc2

поведение mex-файла может быть изменено в зависимости от имени функции.

Хотя пользователь должен включать только mex.h в свой код, Octave объявляет дополнительные функции, определения типов и т.д., доступные пользователю для написания mex-файлов в заголовках mexproto.h и mxarray.h.

© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v5.2.0/Getting-Started-with-Mex_002dFiles.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API