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::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);
}
}
我有一个数据的相关矩阵,我想使用 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::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);
}
}