return mxGetPr() 的值 -- 等效循环

return value of mxGetPr() -- equivalent looping

我正在尝试将 mexFunction() 实现到 "pure" 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++;
       }
   }

遍历与输入值prhs[3]相同的d矩阵,但显然不正确。 我猜返回值的 order/type 和原来的 mexFunction.

不一样

编辑

现在我有 cv::Matd;而不是 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++;
       }
   }

但是这里 "d" 矩阵的 (int)d.at(i,j) returns 值...在原始代码中,mxGetPr() 返回了一个指针.

mxGetPr returns 一个类型为 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 接口的方式。