2015-07-26 3 views
2

У меня есть 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 правильный для первого элемента, но все остальное не так - я должен делать что-то принципиально неправильное. Любые мысли или указатель в правильном направлении были бы оценены; Спасибо всем!

ответ

3

При вызове функции, как

rgb_to_uint8 testmatrix 

, что эквивалентно вызову его как этот

rgb_to_uint8('testmatrix') 

который является таким же, как это:

c = 'testmatrix' 
rgb_to_uint8(c) 

, который, конечно, массив символов размером 1x10 (2D). Вам необходимо позвонить как функция:

rgb_to_uint8(testmatrix) 
+0

ОН МОЙ БОГ, мне стыдно! Огромное спасибо; Я был в сорняках, ища ответ и не мог его обнаружить. Спасибо Спасибо! Выход Сейчас: >> rgb_to_uint8 (testmatrix) тускнеет: 4 М: 2 N: 2 л: 3 Вт: 5 Точно так, как я ожидал! – trayres

+1

@trayres Это причуда языка, ИМО. Я всегда звоню в круглые скобки, даже если аргумент является строкой, просто для того, чтобы быть последовательным. – chappjc

Смежные вопросы