У меня есть 4-мерный массив в MATLAB; Я пытаюсь получить доступ к массиву в функции MEX. Следующее создает «testmatrix», матрицу из 4 измерений с известными данными типа uint8
.Прочитать 4D-массив в файле MEX
%Create a 4D array 2x,2y, rgb(3), framenumber(from 1 to 5)
%Framenumber from 1 to 5
testmatrix(1,1,1,1) = 0;
testmatrix(1,1,1,2) = 1;
testmatrix(1,1,1,3) = 2;
testmatrix(1,1,1,4) = 3;
testmatrix(1,1,1,5) = 4;
testmatrix(1,1,2,1) = 5;
testmatrix(1,1,2,2) = 6;
testmatrix(1,1,2,3) = 7;
testmatrix(1,1,2,4) = 8;
testmatrix(1,1,2,5) = 9;
testmatrix(1,1,3,1) = 10;
testmatrix(1,1,3,2) = 11;
testmatrix(1,1,3,3) = 12;
testmatrix(1,1,3,4) = 13;
testmatrix(1,1,3,5) = 14;
testmatrix(1,2,1,1) = 15;
testmatrix(1,2,1,2) = 16;
testmatrix(1,2,1,3) = 17;
testmatrix(1,2,1,4) = 18;
testmatrix(1,2,1,5) = 19;
testmatrix(1,2,2,1) = 20;
testmatrix(1,2,2,2) = 21;
testmatrix(1,2,2,3) = 22;
testmatrix(1,2,2,4) = 23;
testmatrix(1,2,2,5) = 24;
testmatrix(1,2,3,1) = 25;
testmatrix(1,2,3,2) = 26;
testmatrix(1,2,3,3) = 27;
testmatrix(1,2,3,4) = 28;
testmatrix(1,2,3,5) = 29;
testmatrix(2,1,1,1) = 30;
testmatrix(2,1,1,2) = 31;
testmatrix(2,1,1,3) = 32;
testmatrix(2,1,1,4) = 33;
testmatrix(2,1,1,5) = 34;
testmatrix(2,1,2,1) = 35;
testmatrix(2,1,2,2) = 36;
testmatrix(2,1,2,3) = 37;
testmatrix(2,1,2,4) = 38;
testmatrix(2,1,2,5) = 39;
testmatrix(2,1,3,1) = 40;
testmatrix(2,1,3,2) = 41;
testmatrix(2,1,3,3) = 42;
testmatrix(2,1,3,4) = 43;
testmatrix(2,1,3,5) = 44;
testmatrix(2,2,1,1) = 45;
testmatrix(2,2,1,2) = 46;
testmatrix(2,2,1,3) = 47;
testmatrix(2,2,1,4) = 48;
testmatrix(2,2,1,5) = 49;
testmatrix(2,2,2,1) = 50;
testmatrix(2,2,2,2) = 51;
testmatrix(2,2,2,3) = 52;
testmatrix(2,2,2,4) = 53;
testmatrix(2,2,2,5) = 54;
testmatrix(2,2,3,1) = 55;
testmatrix(2,2,3,2) = 56;
testmatrix(2,2,3,3) = 57;
testmatrix(2,2,3,4) = 58;
testmatrix(2,2,3,5) = 59;
testmatrix = uint8(testmatrix);
Однако я получаю неправильные размеры, когда я пытаюсь использовать mxGetNumberOfDimensions
мой код выглядит следующим образом:
#include "mex.h"
void
mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
//Check - expect 1 input, expect 1 outputs
if (nrhs != 1) {
mexErrMsgIdAndTxt("MATLAB:24bit_pixel_from_uint8_rgb:invalidNumInputs",
"One input argument required.");
}
if (nlhs > 1) {
mexErrMsgIdAndTxt("MATLAB:24bit_pixel_from_uint8_rgb:maxlhs",
"Too many output arguments.");
}
//declare variables
mxArray *a_in_m, *b_out_m;
double *a, *b, *c, *d;
int dimx, dimy, numdims;
int dima, dimb, dimc, dimd;
int i,j,M,N,L,W;
//Comment
mwSize *dim_array, dims;
dims = mxGetNumberOfDimensions(prhs[0]);
dim_array = mxGetDimensions(prhs[0]);
M = dim_array[0];
N = dim_array[1];
L = dim_array[2];
W = dim_array[3];
mexPrintf("dims: %d\n",dims);
mexPrintf("M: %d\n",M);
mexPrintf("N: %d\n",N);
mexPrintf("L: %d\n",L);
mexPrintf("W: %d\n",W);
}
В результате этого MEX файла на testarray
следующим образом:
>> rgb_to_uint8 testmatrix
dims: 2
M: 1
N: 10
L: 1634887535
W: 1766203501
dims
правильный для первого элемента, но все остальное не так - я должен делать что-то принципиально неправильное. Любые мысли или указатель в правильном направлении были бы оценены; Спасибо всем!
ОН МОЙ БОГ, мне стыдно! Огромное спасибо; Я был в сорняках, ища ответ и не мог его обнаружить. Спасибо Спасибо! Выход Сейчас: >> rgb_to_uint8 (testmatrix) тускнеет: 4 М: 2 N: 2 л: 3 Вт: 5 Точно так, как я ожидал! – trayres
@trayres Это причуда языка, ИМО. Я всегда звоню в круглые скобки, даже если аргумент является строкой, просто для того, чтобы быть последовательным. – chappjc