Matlab Mex: доступ к данным - PullRequest
       1

Matlab Mex: доступ к данным

1 голос
/ 28 апреля 2011

Привет, Я не очень понимаю, как получить доступ к данным, передаваемым через аргументы в matlab для mex-функции. Предполагая, что у меня есть функция шлюза по умолчанию

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

И теперь я получаю указатель на входной аргумент 1.

double* data_in;
data_in = mxGetPr(prhs[0]);

Обе следующие строки КАЖДОГО по отдельности приводят к падению моего matlab:

mexPrintf("%d", *data_in);
mexPrintf("%d", data_in[1]);

Но почему я не могу получить такой доступ к данным, когда data_in явно является указателем на первый аргумент?

  1. Когда мне нужно объявить указатель как double *, а когда как mxArray *? Иногда я вижу что-то подобное: mxArray * arr = mxCreateDoubleMatrix (n, m, mxREAL);!?

Заранее большое спасибо!

Ответы [ 2 ]

5 голосов
/ 28 апреля 2011

data_in - указатель на double, поэтому вам нужно что-то вроде

mexPrintf("%f", data_in[0]);

Предполагается, что вызывающая сторона передала вектор или матрицу размером> 0.

В общем, вы можете

int n = mxGetN(array);
int m = mxGetM(array);

Чтобы получить количество строк и столбцов матрицы / вектора, переданных в функцию mex.

Относительно mxArray:

Matlab упаковывает свои матрицы (сложные и действительные) в структуру mxArray. mxCreateDoubleMatrix возвращает указатель на такую ​​структуру. Чтобы реально получить доступ к этим данным, вам нужно использовать mxGetPr () для реальной части и mxGetPi () для мнимых частей.

Они возвращают указатели на выделенные массивы double[], которые можно использовать для доступа (чтения и записи) к элементам матрицы.

2 голосов
/ 28 января 2014

Очень удобный способ обработки измерений mxArrays - ввести функцию, подобную следующей:

#include <cstddef>
#include <cstdarg>
#include "mex.h"

bool mxCheckDimensions(const mxArray* mx_array, size_t n_dim,...) {
    va_list ap;             /* varargs list traverser */

    size_t *dims;           /* dimension list */
    size_t i;
    size_t dim;
    bool retval = true;

    va_start(ap,n_dim);
    dims = (size_t *) malloc(n_dim*sizeof(size_t));

    for(i=0;i<n_dim;i++) {
        dims[i] = va_arg(ap,size_t);
        dim  = mxGetDimensions(mx_array)[i];
        if (dim != dims[i])
            retval = false;
    }

    va_end(ap);
    free(dims);

    return retval;
}

Таким образом, вы проверяете массив mxArray * p - это двойной массив размером, скажем, 1,3используя

double* pDouble = NULL;

if (mxIsDouble(p)) {
    if (mxCheckDimensions(p, 2, 1, 3)) {
        pDouble = (double*) GetData(p);
        // Do whatever
    }
}`
...