返回值 mxGetPr() -- 等效循环
return value of mxGetPr() -- equivalent looping
我正在尝试将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
是矩阵中的行数,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 作为制作与 MATLAB 接口的预编写C++代码的方式。
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 用于C++中带有数组和指针的循环
- 循环中的随机函数
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 返回值 mxGetPr() -- 等效循环