我正在尝试将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()返回一个指针。
答案 0 :(得分:2)
mxGetPr
返回类型为double
的指针,因此您可以使用指针算法访问数据。此外,您必须记住返回给您的指针具有 column-major 顺序的数据。这意味着您必须按行传输数据,而不是像传统的C顺序那样逐列遍历数据。
按列主要顺序,您可以使用以下线性索引访问位置(i, j)
:
j * rows + i
rows
是矩阵中的行数,i
和j
是您要访问的行和列。在行主要或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接口的方式。