Я хочу дать массив произвольного размера моему mexFunction
, но как-то не могу определить его размер в моем C-коде. Я уже пробовал sizeof(prhs[0])
(предполагая, что массив является первым входным аргументом), но это всегда возвращает 8 - независимо от размера массива и типа. Итак, какие-то идеи? Кстати, я использую Octave.Как определить размер массива в Matlab/Octave `mexFunction` (не nrhs)
0
A
ответ
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
Я предполагаю, что вы только начинаете с интерфейсом MEX и C (учитывая, что вы думали, что 'SizeOf 'дал бы вам ответ). Поскольку вы используете Octave, попробуйте [oct файл] (https://www.gnu.org/software/octave/doc/interpreter/Oct_002dFiles.html#Oct_002dFiles). API C++ Octave будет проще и более похож на сам язык Octave. – carandraug
Но, чтобы ответить на ваш вопрос в любом случае (и я еще раз подчеркну, что если вы используете 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
Thnx для ответа, в то время как представленное здесь решение, вероятно, является правильным, Octave crashes когда я использую функции в своем C-коде. Я посмотрю на oct-файлы. – Smeik