代码之家  ›  专栏  ›  技术社区  ›  Kristan

mxGetPr()的返回值--等效循环

  •  0
  • Kristan  · 技术社区  · 8 年前

    我正在尝试实现一个 mexFunction() 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 .

    编辑

    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++;
           }
       }
    

    1 回复  |  直到 8 年前
        1
  •  2
  •   rayryeng    8 年前

    mxGetPr 返回类型为的指针 double 主列

    在列主顺序中,您可以访问位置 (i, j) 具有以下线性指数:

    j * rows + i
    

    rows i j

    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数据的指针已经存在 .这很恶心,但这是你必须做的。您可以使用 D 按行主顺序排列,因此它与代码的其余部分兼容。我假设您正在使用MATLAB MEX作为一种方式来制作预编写的C++代码,以便与MATLAB接口。