vector<vector<double>> 使用 memcpy 到 mxArray

vector<vector<double>> to mxArray using 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");   
}

谢谢
此致

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

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

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

您可以参考此answer了解如何使用 memcpy 复制一维向量。

编辑:

从二维数组复制到二维向量(假设向量的大小已经是行*列)

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

请注意做出的假设

更简洁的方法是使用 std::assignstd::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);
    }
}