2017-08-09 218 views
0

我试图实现一个mexFunction()到“纯”C++(OpenCV),但返回值mxGetPr()对我来说根本不清楚。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不一样。

编辑

现在我的简历::垫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()返回的值。

回答

2

​​返回类型为double的指针,以便您可以使用指针算术来访问您的数据。另外,您必须记住返回给您的指针具有列专业顺序中的数据。这意味着你必须按照传统的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接口的方式。

+0

我已编辑了一下代码。 * D指向具有int值的容器的指针。但是输入矩阵具有浮点值,那么mxGetPr(prhs [3])[i]实际上是否返回到D [i]?你可以帮我吗? – Kristan

+0

@Kristan在存储之前将数据转换为int。我将编辑我的帖子。这并不安全,但这就是你所做的。来自MATLAB的输入矩阵也是**浮点数?也就是说,当你调用你的MEX函数时,是你的MEX函数中的第三个输入参数的输入类型**还有**类型的double或浮点数?在编辑我的帖子之前,这很重要。 – rayryeng

+0

是的,输入矩阵有浮点值。我想要做的是,而不是使用mxGetPr(),我想使用其他(最好是OpenCV)函数返回与mxGetPr()一样的值。原因是我不再使用原始的Matlab代码,而是“纯粹”的C++(OpenCV)。 – Kristan