2016-06-21 4 views
0

Я хочу дать массив произвольного размера моему mexFunction, но как-то не могу определить его размер в моем C-коде. Я уже пробовал sizeof(prhs[0]) (предполагая, что массив является первым входным аргументом), но это всегда возвращает 8 - независимо от размера массива и типа. Итак, какие-то идеи? Кстати, я использую Octave.Как определить размер массива в Matlab/Octave `mexFunction` (не nrhs)

+2

Я предполагаю, что вы только начинаете с интерфейсом MEX и C (учитывая, что вы думали, что 'SizeOf 'дал бы вам ответ). Поскольку вы используете Octave, попробуйте [oct файл] (https://www.gnu.org/software/octave/doc/interpreter/Oct_002dFiles.html#Oct_002dFiles). API C++ Octave будет проще и более похож на сам язык Octave. – carandraug

+4

Но, чтобы ответить на ваш вопрос в любом случае (и я еще раз подчеркну, что если вы используете Octave, вам будет лучше с oct-файлом), используйте функции 'mxGetNumberOfDimensions' и' mxGetDimensions'. Раздел руководства Octave по [Работа с матрицами и массивами в Mex-файлах] (https://www.gnu.org/software/octave/doc/interpreter/Working-with-Matrices-and-Arrays-in-Mex_002dFiles.html) и [ссылка для doxygen Octave для интерфейса mex] (http://octave.org/doxygen/4.0/df/d4e/mex_8cc.html) – carandraug

+0

Thnx для ответа, в то время как представленное здесь решение, вероятно, является правильным, Octave crashes когда я использую функции в своем C-коде. Я посмотрю на oct-файлы. – Smeik

ответ

1

Поскольку вы упомянули о комментариях, которые вы пытаетесь использовать ОКТ файлы, вот как это сделать (вы все равно должны пройти через раздел руководства по oct-files):

$ cat foo.cc 
#include <octave/oct.h> 

DEFUN_DLD (foo, args, , 
      "foo help text") 
{ 
    if (args.length() != 1) 
    { 
     print_usage(); 
     return octave_value_list(); 
    } 

    const NDArray m = args(0).array_value(); 
    if (error_state) 
    { 
     error ("foo: first input must be a numeric N dimensional array"); 
     return octave_value_list(); 
    } 

    const dim_vector dims = m.dims(); 
    for (int i = 0; i < dims.length(); i++) 
    octave_stdout << "Dim " << i << " has length " << dims(i) << std::endl; 

    return octave_value_list(); 
} 
$ mkoctfile foo.cc 
$ octave 
octave:1> foo (rand (5, 3, 1, 2)) 
Dim 0 has length 5 
Dim 1 has length 3 
Dim 2 has length 1 
Dim 3 has length 2 
octave:2> foo ("bar") 
error: invalid conversion from string to real N-d array 
error: foo: first input must be a numeric N dimensional array 

Если вы действительно хотите использовать интерфейс MEX, вот упрощенная версия без проверки вообще (это будет сегментации, если вы даете неправильный вход):

$ cat foo.c 
#include "mex.h" 

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

    const mwSize nd = mxGetNumberOfDimensions (prhs[0]); 
    const mwSize* dims = mxGetDimensions (prhs[0]); 

    for (int i = 0; i < nd; i++) 
    mexPrintf("Dim %i has length %i\n", i, dims[i]); 

    return; 
} 
$ mkoctfile --mex foo.c 
$ octave 
octave:1> foo (rand (5, 2, 3)) 
Dim 0 has length 5 
Dim 1 has length 2 
Dim 2 has length 3