mxGetPr()的返回值 - 等效循环

时间:2017-08-09 14:13:23

标签: c++ matlab opencv mex

我正在尝试将mexFunction()实现为“纯”C ++(OpenCV),但mxGetPr()返回的值对我来说根本不清楚。

以下代码旨在实施:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {

       int *D = new int[N*L];

       // where N and L are dimensions (cols and rows) of matrix prhs[3] 
       // prhs[3] is a NxL matrix containing floating point value

       for (int i=0; i<N*L; i++)
           D[i] = mxGetPr(prhs[3])[i];


    }

我的问题是,mxGetPr(prhs[3])[i]mxGetPr(prhs[4])[i]给出了什么样的价值?它是如何在矩阵中循环的?

我试着这样做:

for (int i=0; i<l; i++)
   {
       for(int j=0; j<n; j++)
       {
           D[iCounter] = (int)d.at<uchar>(i,j);
           iCounter++;
       }
   }

循环遍历d矩阵,该矩阵与输入值prhs[3]相同,但显然不正确。 我想返回值的顺序/类型与原始mexFunction中的顺序/类型不同。

修改

现在我有cv :: Mat d;而不是prhs [3]并尝试在mexfunction中做同样的事情。

int *D = new int[N*L];

int iCounter = 0;

for (int i=0; i<L; i++)
   {
       for(int j=0; j<N; j++)
       {
           D[iCounter] = (int)d.at<uchar>(i,j);
           iCounter++;
       }
   }

但是这里(int)d.at(i,j)返回“d”矩阵的值...在roiginal代码中,mxGetPr()返回一个指针。

1 个答案:

答案 0 :(得分:2)

mxGetPr返回类型为double的指针,因此您可以使用指针算法访问数据。此外,您必须记住返回给您的指针具有 column-major 顺序的数据。这意味着您必须按行传输数据,而不是像传统的C顺序那样逐列遍历数据。

按列主要顺序,您可以使用以下线性索引访问位置(i, j)

j * rows + i

rows是矩阵中的行数,ij是您要访问的行和列。在行主要或C顺序中,您访问数据的方式是:

i * cols + j

此处cols是矩阵中的列数。我假设您想要以行主格式而不是列主要格式布置数据。因此,如果您想使用两个for循环遍历数据,请执行以下操作:

double *ptr = mxGetPr(prhs[3]);

// A L x N matrix - L rows, N columns
for (int i = 0; i < L; i++)
{
    for (int j = 0; j < N; j++)
    {
        D[i * N + j] = (int) ptr[j * L + i];
    }
}

这里D是指向整数数据的指针。您必须转换数据才能执行此操作,因为指向MATLAB数据的指针已经double。这是令人讨厌的,但这就是你必须要做的。您可以在行主要顺序中使用D,以便与其余代码兼容。我假设您使用MATLAB MEX作为预编写的C ++代码与MATLAB接口的方式。