我正在使用mex在Windows 10的MATLAB中实现C ++代码。我想修改我创建的2D数组的元素,但是一直出现此错误。下面是代码和错误消息。
#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不相关。在此先感谢您。
此行不正确,B
和val
是指向double
的指针,因此不能被索引两次,只能被索引一次。
B[i][j] = val[i][j];
将MATLAB数组中的数据视为一维数组,其中逻辑数组的列将堆叠在其中。给定m
行和n
列,就可以使用i
获取矩阵元素(j
,i + m*j
)在存储器中的位置。因此,您的复制操作应为:
B[i + m*j] = val[i + m*j];
但是,由于n
是由第二个参数给出的,因此上述内容可能会导致问题,并且不能保证输入矩阵的列数要多。您需要添加一个显式测试,以验证matrix
至少具有n
列,并且它是一个双值矩阵(例如,如果类型为single
,则会从中读出界也一样,因为mxGetPr
总是返回指向double
的指针,而不管数组中的实际数据是什么。