Spec-Zone.ru › Octave 6

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

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

: mex [-options] file …
: status = mex (…)

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

status — это код возврата функции mkoctfile.

Если компиляция завершается неудачно, и аргумент возврата не запрашивается, возникает ошибка. Однако, если программист запросит status, Octave просто выдаст предупреждение, и программист обязан проверить, была ли команда выполнена успешно.

Это эквивалентно 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/v6.4.0/Getting-Started-with-Mex_002dFiles.html

Spec-Zone.ru

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