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

return value of mxGetPr() -- equivalent looping

本文关键字:循环 mxGetPr 返回值      更新时间:2023-10-16

我正在尝试将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(( 返回。

>mxGetPr返回类型为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 作为制作与 MATLAB 接口的预编写C++代码的方式。