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
是矩阵中的行数,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 接口的方式。
我正在尝试将 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
是矩阵中的行数,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 接口的方式。