我正在使用mex在Windows10上实现C++代码,我想修改我创建的二维数组的元素,但是我一直在得到这个错误。下面是代码和错误信息。
#include <omp.h>
#include "mex.h"
#include "matrix.h"
// net.idx_phiz{m}(:,1:num_v) => get_index(net.idx_phiz{m}, num_v)
extern "C" void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
//receive value and create output variable
auto& matrix = prhs[0];
auto& size = prhs[1];
auto& out = plhs[0];
//get size
auto m = mxGetM(matrix);
auto n = mxGetPr(size)[0];
//get value
auto val = mxGetPr(matrix);
//create output pointer
out = mxCreateNumericMatrix(m, n, mxDOUBLE_CLASS, mxREAL);
auto B = (double*)mxGetPr(out);
#pragma omp parallel for schedule(static)
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
B[i][j] = val[i][j];
}
}
}从最后一行中,我得到了如下错误:
error C2109: subscript requires array or pointer type我查阅了过去的讨论,但它们通常是错误的C2109,而不是属于mex的。提前谢谢你。
发布于 2020-05-19 14:58:03
这一行不正确,B和val是指向double的指针,因此不能进行两次索引,只能索引一次。
B[i][j] = val[i][j];将MATLAB数组中的数据看作一维数组,其中逻辑数组的列被堆叠。给定m行和n列,您可以获得具有i + m*j的矩阵元素(i、j)在内存中的位置。因此,您的复制操作应改为:
B[i + m*j] = val[i + m*j];但是,由于n是由第二个参数给出的,所以上述情况可能会导致问题,而且不能保证输入矩阵有许多列。您需要添加一个显式测试来验证matrix至少有n列,并且它是一个双值矩阵(例如,如果它是超出界限的single类型的话),因为mxGetPr总是返回指向double的指针,而不管数组中的数据实际是什么。
https://stackoverflow.com/questions/61893460
复制相似问题