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

C++ mxGetPr()的返回值--等效循环,c++,matlab,opencv,mex,C++,Matlab,Opencv,Mex,我尝试将一个 Max函数()/Cube >到“纯”C++(OpenCV)中,但是返回的值由 MxGETPRE()>代码>对我来说并不清楚。 以下代码旨在实施: 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)

我尝试将一个<代码> Max函数()/Cube >到“纯”C++(OpenCV)中,但是返回的值由<代码> MxGETPRE()>代码>对我来说并不清楚。 以下代码旨在实施:

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];


    }
循环通过与输入值相同的
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=新的int[N*L];
int i计数器=0;
for(int i=0;i返回类型为
double
的指针,因此您可以使用指针算法访问数据。此外,您必须记住,返回给您的指针的数据的顺序为列主顺序。这意味着您必须按行而不是按传统的C顺序逐列遍历数据

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

j * rows + i
rows
是矩阵中的行数,
i
j
是您要访问的行和列。按行主顺序或C顺序,您访问数据的方式是:

i * cols + j
这里的
cols
是矩阵中的列数。我假设您希望以行主格式而不是列主格式排列数据。因此,如果您希望使用两个
for
循环遍历数据,请执行以下操作:

for (int i=0; i<l; i++)
   {
       for(int j=0; j<n; j++)
       {
           D[iCounter] = (int)d.at<uchar>(i,j);
           iCounter++;
       }
   }
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];
    }
}
double*ptr=mxGetPr(prhs[3]);
//A L x N矩阵-L行,N列
对于(int i=0;i
这里的
D
是一个指向整数数据的指针。为了做到这一点,您必须强制转换数据,因为来自MATLAB的数据指针已经是
double
。这很糟糕,但这就是您必须做的。您可以按行的主要顺序使用
D
,以便它与您的其余代码兼容。我假设您使用的是mATLAB MEX作为编写预编译的C++代码的接口,与Matlab接口。

返回一个类型为“代码>代码>双代码/代码的指针,这样您就可以使用指针算法访问您的数据。而且,您必须记住返回给您的指针的数据在强>列主< <强>订单中。这意味着您必须遍历您的数据行。而不是像传统的C顺序那样按列排序

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

j * rows + i
rows
是矩阵中的行数,
i
j
是您要访问的行和列。按行主顺序或C顺序,您访问数据的方式是:

i * cols + j
这里的
cols
是矩阵中的列数。我假设您希望以行主格式而不是列主格式排列数据。因此,如果您希望使用两个
for
循环遍历数据,请执行以下操作:

for (int i=0; i<l; i++)
   {
       for(int j=0; j<n; j++)
       {
           D[iCounter] = (int)d.at<uchar>(i,j);
           iCounter++;
       }
   }
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];
    }
}
double*ptr=mxGetPr(prhs[3]);
//A L x N矩阵-L行,N列
对于(int i=0;i

这里的
D
是一个指向整数数据的指针。为了做到这一点,您必须强制转换数据,因为来自MATLAB的数据指针已经是
double
。这很糟糕,但这就是您必须做的。您可以按行的主要顺序使用
D
,以便它与您的其余代码兼容。我假设您使用的是mATLAB MEX作为编写预先编写的C++代码与Matlab接口的方法。

我已经编辑了代码。*一个指向int值的容器的指针。但是输入矩阵具有浮点值,所以MxGETPR(PRHS(3))[I]返回到D[i]中。事实上?你能帮我吗?@Kristan在存储之前将数据转换成
int
。我会编辑我的帖子。这不安全,但你就是这么做的。来自MATLAB的输入矩阵也是浮点型的吗?也就是说,当你调用你的MEX函数时,你的MEX函数中第三个输入参数的输入类型也是double
或浮点?这在我编辑帖子之前很重要。是的,输入矩阵有浮点值。我想做的是,我想使用其他函数(最好是OpenCV)来返回与mxGetPr()相同的值,而不是使用mxGetPr()原因是我不再使用原始的Matlab代码,而是“纯粹”的C++(OpenCV)。在使用任何OpenCV方法之前,您必须将数据复制到
cv::Mat
中。我将编辑我的帖子,但您所做的只是将数据强制转换。不,您正在将存储在
mxGetPr
指向的内存中的值复制到
d
中分配的内存中。我想我到此为止。我不知道您想要什么,也许有人想要else可以帮助您。我对代码进行了一些编辑。*D是指向具有int值的容器的指针。但是输入矩阵具有浮点值,所以mxGetPr(prhs[3])[I]返回到D[I]事实上?你能帮我吗?@Kristan在存储之前将数据转换成
int
。我会编辑我的帖子。这不安全,但你就是这么做的。来自MATLAB的输入矩阵也是浮点型的吗?也就是说,当你调用你的MEX函数时,你的MEX函数中第三个输入参数的输入类型也是double
或浮点?这在我编辑帖子之前很重要。是的,输入矩阵有浮点值。我想做的是,我想使用其他函数(最好是OpenCV)来返回与mxGetPr()相同的值,而不是使用mxGetPr()是的。原因是我不再使用原始的Matlab代码,而是“纯粹”的C++(OpenCV)。在使用usi之前,您必须将数据复制到
cv::Mat