gpt4 book ai didi

c++ - vector> 到 mxArray 使用 memcpy

转载 作者:行者123 更新时间:2023-11-28 01:28:07 24 4
gpt4 key购买 nike

我有一个数据的相关矩阵,我想使用 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 复制一维 vector 。

编辑:

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

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

关于c++ - vector<vector<double>> 到 mxArray 使用 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52936956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com