我具有数据的相关矩阵,我想使用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");
}
谢谢
问候
答案 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);
}
}