错误C2109:下标需要数组或指针类型(MEX,Windows 10)

问题描述 投票:0回答:1

我正在使用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不相关。在此先感谢您。

c++ matlab mex
1个回答
0
投票

此行不正确,Bval是指向double的指针,因此不能被索引两次,只能被索引一次。

B[i][j] = val[i][j];

将MATLAB数组中的数据视为一维数组,其中逻辑数组的列将堆叠在其中。给定m行和n列,就可以使用i获取矩阵元素(ji + m*j)在存储器中的位置。因此,您的复制操作应为:

B[i + m*j] = val[i + m*j];

但是,由于n是由第二个参数给出的,因此上述内容可能会导致问题,并且不能保证输入矩阵的列数要多。您需要添加一个显式测试,以验证matrix至少具有n列,并且它是一个双值矩阵(例如,如果类型为single,则会从中读出界也一样,因为mxGetPr总是返回指向double的指针,而不管数组中的实际数据是什么。

© www.soinside.com 2019 - 2024. All rights reserved.