Когда вы передаете какую-либо матрицу в функцию MEX, она сохраняется в виде 1D-массива в главном порядке столбцов.Таким образом, наиболее быстрый последовательный доступ к нему осуществляется с помощью линейных индексов.
В случае изображения вы можете получить к нему доступ в виде двумерной матрицы, если хотите, вам просто нужно сопоставить индексы строк / столбцов с линейными индексами с помощьюпростой расчет.
Рассмотрим этот пример:
matrixExample.c
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mwSize r,c, i,j, n;
double *input;
/* get size of the matrix */
r = mxGetM(prhs[0]);
c = mxGetN(prhs[0]);
/* get pointer to data */
input = mxGetPr(prhs[0]);
/* access matrix using row/column indices */
for (i=0; i<r; i++) {
for (j=0; j<c; j++) {
mexPrintf("%lf ", input[j*r+i]);
}
mexPrintf("\n");
}
/* access matrix using linear indices (column-major) */
n = mxGetNumberOfElements(prhs[0]);
for (i=0; i<n; i++) {
mexPrintf("%lf\n", input[i]);
}
}
Скомпилируйте эту функцию MEX:
>> mex -largeArrayDims matrixExample.c
Затем вы можете использоватьэто на примере матрицы:
>> matrixExample( rand(2,3) )
0.646204 0.592287 0.464080
0.668417 0.740318 0.143579
0.646204
0.668417
0.592287
0.740318
0.464080
0.143579
Обратите внимание, что я пропустил проверку входных данных только для простоты примера.
Все должно быть объяснено в документации, поэтому начните с чтения руководство пользователя и, при необходимости, ссылки на API .
Также имеется ряд примеров, включенных в MATLAB, которые вы можете изучить:
>> winopen( fullfile(matlabroot,'extern','examples','mex') )
>> winopen( fullfile(matlabroot,'extern','examples','mx') )