使用memcpy将vector <vector <double >>转换为mxArray

时间:2018-10-22 20:01:45

标签: c++ matlab pca mex memcpy

我具有数据的相关矩阵,我想使用pca将其转换为不相关的集合。

所以我决定使用matlab引擎(c ++ mex API)执行pca

我的问题是如何有效地将矩阵内容复制到mxArray 我使用循环分配矩阵的每个元素...另一方面,我一直在寻找memcpy,而且似乎容易出错。

尽管我已经测试了以下内容,但它只是复制了第一列!

memcpy((double *)mxGetPr(T), &rho_mat[0][0], rows * sizeof(double));

什么是复制数据的最佳方法(矩阵-> mxArray和mxArray->矩阵)?

void pca(vector<vector<double>>& rho_mat)
{
    Engine *ep;
    mxArray *T = NULL, *result = NULL;

    if (!(ep = engOpen(""))) {
        fprintf(stderr, "\nCan't start MATLAB engine\n");
        return;
    }

    size_t rows = rho_mat.size();
    size_t cols = rho_mat[0].size();

    T = mxCreateDoubleMatrix(rows, cols, mxREAL);

   double * buf = (double *)mxGetPr(T);

   for (int i = 0; i<rows; i++) {
       for (int j = 0; j<cols; j++) {
           buf[i*(cols)+j] = rho_mat[i][j];
       }
   }

    engPutVariable(ep, "T", T);


    engEvalString(ep, "PC = pcacov(T);");
    result = engGetVariable(ep, "PC");   
}

谢谢
问候

1 个答案:

答案 0 :(得分:2)

您可以尝试在每一行的循环中使用std::memcpy

for (int i = 0; i<rows; i++)
{
    std::memcpy(buf + i*cols, &rho_mat[i][0], cols * sizeof(double));
}

请注意,您必须在memcpy中使用 cols ,以确保复制了每一行。在您的示例中,如果矩阵为正方形,那可能是巧合。

关于如何使用memcpy复制一维向量,您可以参考此answer

编辑:

要从二维数组复制到二维矢量(假设矢量已经是行大小* cols)

for (int i = 0; i<rows; i++)
{
    std::memcpy(&rho_mat[i][0], buf + i*cols, cols * sizeof(double));
}

请注意所做的假设

OR

一种更简洁的方法是使用std::assign或构造函数来std::vector

if(rho_mat.size() == 0)
{
    for (int i = 0; i<rows; i++)
    {
         rho_mat.push_back(vector<int>(buf + i*cols, buf + i*cols + cols));
         //OR
         //rho_mat.push_back(vector<int>());
         //rho_mat[i].assign(buf + i*cols, buf + i*cols + cols);
    }
}