读取 MEX 文件中的 4D 数组

Posted

技术标签:

【中文标题】读取 MEX 文件中的 4D 数组【英文标题】:Read 4D Array in MEX File 【发布时间】:2015-07-26 21:23:16 【问题描述】:

我在 MATLAB 中有一个 4 维数组;我正在尝试访问 MEX 函数中的数组。下面创建“testmatrix”,一个 4 维矩阵,已知数据为uint8 类型。

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


testarray 上的 mex 文件的结果如下:

>> rgb_to_uint8 testmatrix
dims: 2
M: 1
N: 10
L: 1634887535
W: 1766203501

dims 对于第一个元素是正确的,但其他一切都是错误的——我一定是在做一些根本不正确的事情。任何想法或正确方向的指针将不胜感激;谢谢大家!

【问题讨论】:

【参考方案1】:

当你调用像

这样的函数时
rgb_to_uint8 testmatrix

相当于这样称呼它

rgb_to_uint8('testmatrix')

与此相同:

c = 'testmatrix'
rgb_to_uint8(c)

这当然是一个大小为 1x10 (2D) 的字符数组。你需要像函数一样调用:

rgb_to_uint8(testmatrix)

【讨论】:

天哪,我很惭愧!非常感谢;我在杂草中寻找答案,却找不到。谢谢谢谢!现在的输出:>> rgb_to_uint8(testmatrix) dims: 4 M: 2 N: 2 L: 3 W: 5 完全符合我的预期! @trayres 这是语言的一个怪癖,IMO。即使参数是字符串,我也总是用括号调用,只是为了保持一致。

以上是关于读取 MEX 文件中的 4D 数组的主要内容,如果未能解决你的问题,请参考以下文章

用C读取matlab的mat文件

读取大型 JSON 文件而不挂在 Unity 中

如何逐行读取 Matlab mex 函数的输入矩阵?

如何逐行读取 Matlab mex 函数的输入矩阵?

从多个线程读取数组时要注意啥?

在 MATLAB 中使用 MEX 文件访问存储在元胞数组中的矩阵