Matlab MEX文件 - 索引正确,UINT32值不正确

时间:2015-07-27 02:43:53

标签: c matlab mex

这是我上一个问题here

的下一步

使用与我的问题相同的Matlab测试矩阵:

testmatrix代码:

%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);

我创建了以下Mex文件:

    #include <stdint.h>
#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
    mwSize *dim_array, dims;
    mxArray *a_in_m, *b_out_m;
    uint8_T *a,b;
    int X,Y,RGB,FRAMENUMBER;
    int X_INDX,Y_INDX,RGB_INDX,FRAMENUMBER_INDX;

    dims             = mxGetNumberOfDimensions(prhs[0]);
    dim_array        = mxGetDimensions(prhs[0]);   
    X                = dim_array[0];
    Y                = dim_array[1];
    RGB              = dim_array[2];
    FRAMENUMBER      = dim_array[3];
    mexPrintf("dims: %d\n",dims);
    mexPrintf("X: %d\n",X);
    mexPrintf("Y: %d\n",Y);
    mexPrintf("RGB: %d\n",RGB);
    mexPrintf("FRAMENUMBER: %d\n",FRAMENUMBER);

    a = mxGetData(prhs[0]);
    mexPrintf("a is: %d\n",a[0]); //IS zero, now the other values aren't what I expected...

    b_out_m = plhs[0] = mxCreateNumericArray(dims, dim_array, mxUINT32_CLASS, 0);
    //b = mxGetData(b_out_m);

    int linear_index = 0;
    for(X_INDX=0;X_INDX<X;X_INDX++)
    {
        for(Y_INDX=0;Y_INDX<Y;Y_INDX++)
        {
            for(RGB_INDX=0;RGB_INDX<RGB;RGB_INDX++)
            {
                for(FRAMENUMBER_INDX=0;FRAMENUMBER_INDX<FRAMENUMBER;FRAMENUMBER_INDX++)
                {
                   mexPrintf("Linear Index: %u\n",linear_index); 
                   mexPrintf("Value[%u]: %u\n",FRAMENUMBER_INDX + (RGB_INDX*FRAMENUMBER)+(Y_INDX*RGB*FRAMENUMBER)+(X_INDX*Y*RGB*FRAMENUMBER),(uint8_T)a[linear_index]);//FRAMENUMBER_INDX + (RGB_INDX*FRAMENUMBER)+(Y_INDX*RGB*FRAMENUMBER)+(X_INDX*Y*RGB*FRAMENUMBER)
                   linear_index += 1;
                }
            }
        }

    }
}

我的索引看起来是正确的,但是当我打印出值时,我得到以下内容:

>> rgb_to_uint8(testmatrix)
dims: 4
X: 2
Y: 2
RGB: 3
FRAMENUMBER: 5
a is: 755965440
Linear Index: 0
Value[0]: 755965440
Linear Index: 1
Value[1]: 840180485
Linear Index: 2
Value[2]: 924395530
Linear Index: 3
Value[3]: 772808449
...etc

我显然是在搞错了;有人能指出我正确的方向吗?我随身携带时会编辑它,看看能不能搞清楚。

[编辑]我用下面的建议更新了代码 - 我改为uint8_T,它确实有奇迹,但我希望这个设置能够将内存中的数据读出为0,1,2,3 ...等等。它似乎是&#34;跳过&#34;,这意味着当我试图访问它们时,数组没有存储在内存中 - 我认为Matlab是专栏,所以我用第4维索引,然后是第三个,然后是第二个,然后是第一个......

我正在创建另一个测试矩阵,但我会以另一种方式对其进行索引,并查看是否可以线性读取值。感谢笔记,全部和指向uint8_T的指针(这使得它开始点击更好,并且缺少void * cast)。

1 个答案:

答案 0 :(得分:2)

从我的评论中更新:当您执行testmatrix(:)时,它会以线性顺序读出任何维度数组的所有元素。然后它下降然后是剩余的尺寸。您正在使用testmatrix(1,1,1,1),testmatrix(1,1,1,2),testmatrix(1,1,1,3)遍历最后一个维度。

有几个问题需要解决,但问题的核心是数据类型,正如jucestain所说。当你使用mxGetData时,你得到一个void*,你有责任确保你所投的任何东西都是实际的底层数据类型(在MATLAB数组中)。

一些注意事项:

  • 习惯使用mxIsClass检查输入类型,您不会轻易遇到这些问题。类需要一个字符串类型,这是列出的类型之一您输入help class,就像打电话给isa in MATLAB一样。只需对支票进行编码,就可以仔细检查功能的预期用途。
  • 您无需mxDuplicate prhs[]来获取数据。只需读取数据,但不要写入数据。
  • 仅使用mxGetPr获取double*(仅当mxIsClass表示它是double时才会使用!)。如果您有任何其他数据类型,请使用mxGetData
  • mxGetData会返回void*,您需要并使用显式转换(例如(uint32_t*))来访问数据,但同样,它不会转换基础数据,所以请确保它已经没错了。
  • mxGetDimensions会返回 const mwSize*,所以请记住const