你是 Malc -ing数据,这里没有匹配的免费< /C>。首先,标准的“低级”C++将使用新< /C>和 Dele> (更好地使用 STD::vector < /代码>)。但是实际上你可以使用本征的内存分配。 memcpy(ptr, npy_data.data<double>(), data_row * data_col * sizeof(double));,c++,eigen,C++,Eigen" /> 你是 Malc -ing数据,这里没有匹配的免费< /C>。首先,标准的“低级”C++将使用新< /C>和 Dele> (更好地使用 STD::vector < /代码>)。但是实际上你可以使用本征的内存分配。 memcpy(ptr, npy_data.data<double>(), data_row * data_col * sizeof(double));,c++,eigen,C++,Eigen" />

C++;::如何捕获由void函数创建的矩阵 我通常用Python编码,但由于组合爆炸,我决定用C++来解决问题。我的想法是将NUMPY数组保存在NPY文件中,然后我将输入NPY文件的C++函数。由于我对C++指针和引用的理解有限,我无法总结如何获取空虚函数的值。void函数没有返回任何内容,所以我不能使用通常的赋值操作。如何将新的(&mat_out)赋值给我想要的变量,比如A。或者通过返回值(如第二个注释函数)的另一种方式,但是在这种方法中,我遇到了类型不匹配的问题。我的主要问题是如何使这两种方法中的任何一种都起作用。但从知识的角度来看,我也想知道如何利用在void函数中创建的新对象 #include <iostream> #include <Eigen/Dense> #include "cnpy.h" #include "opencv2/highgui.hpp" using namespace std; using namespace Eigen; using namespace cv; void cnpy2eigen(string data_fname, Eigen::MatrixXd& mat_out){ cnpy::NpyArray npy_data = cnpy::npy_load(data_fname); // double* ptr = npy_data.data<double>(); int data_row = npy_data.shape[0]; int data_col = npy_data.shape[1]; double* ptr = static_cast<double *>(malloc(data_row * data_col * sizeof(double))); memcpy(ptr, npy_data.data<double>(), data_row * data_col * sizeof(double)); cv::Mat dmat = cv::Mat(cv::Size(data_col, data_row), CV_64F, ptr); // CV_64F is equivalent double new (&mat_out) Eigen::Map<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>>(reinterpret_cast<double *>(dmat.data), data_col, data_row); } /* Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> > * cnpy2eigen(string data_fname){ cnpy::NpyArray npy_data = cnpy::npy_load(data_fname); // double* ptr = npy_data.data<double>(); int data_row = npy_data.shape[0]; int data_col = npy_data.shape[1]; double* ptr = static_cast<double *>(malloc(data_row * data_col * sizeof(double))); memcpy(ptr, npy_data.data<double>(), data_row * data_col * sizeof(double)); cv::Mat dmat = cv::Mat(cv::Size(data_col, data_row), CV_64F, ptr); // CV_64F is equivalent double return new (&mat_out) Eigen::Map<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>>(reinterpret_cast<double *>(dmat.data), data_col, data_row); } */ int main() { Eigen::MatrixXd& A = cnpy2eigen("/Users/osmanmamun/Play_Ground/C++_practice/bayesframe/X_data.npy", Eigen::MatrixXd& A); cout << "Here is the matrix A:\n" << A << endl; } #包括 #包括 #包括“cnpy.h” #包括“opencv2/highgui.hpp” 使用名称空间std; 使用名称空间特征; 使用名称空间cv; void cnpy2eigen(字符串数据名称,Eigen::MatrixXd和mat_out){ cnpy::NpyArray npy_数据=cnpy::npy_负载(数据名称); //double*ptr=npy_data.data(); int data_row=npy_data.shape[0]; int data_col=npy_data.shape[1]; double*ptr=静态(malloc(数据行*数据列*大小(双)); memcpy(ptr,npy_data.data(),data_row*data_col*sizeof(double)); cv::Mat dmat=cv::Mat(cv::Size(data_col,data_row),cv_64F,ptr);//cv_64F等于双精度 新建(&mat_out)特征::映射(重新解释转换(dmat.data)、数据列、数据行); } /* Eigen::Map*cnpy2eigen(字符串数据名称){ cnpy::NpyArray npy_数据=cnpy::npy_负载(数据名称); //double*ptr=npy_data.data(); int data_row=npy_data.shape[0]; int data_col=npy_data.shape[1]; double*ptr=静态(malloc(数据行*数据列*大小(双)); memcpy(ptr,npy_data.data(),data_row*data_col*sizeof(double)); cv::Mat dmat=cv::Mat(cv::Size(data_col,data_row),cv_64F,ptr);//cv_64F等于双精度 返回新的(&mat_out)特征::映射(重新解释转换(dmat.data)、数据列、数据行); } */ int main() { 艾根::MatrixXd&A=cnpy2eigen(“/Users/osmanmamun/Play\u Ground/C++\practice/bayesframe/X\u data.npy”,艾根::MatrixXd&A); 你发布的代码有太多问题了 #include <iostream> #include <Eigen/Dense> // minor remark: Often you just need <Eigen/Core> here #include "cnpy.h" #include "opencv2/highgui.hpp" // Do you actually need OpenCV here? using namespace std; using namespace Eigen; using namespace cv; >你是 Malc -ing数据,这里没有匹配的免费< /C>。首先,标准的“低级”C++将使用新< /C>和 Dele> (更好地使用 STD::vector < /代码>)。但是实际上你可以使用本征的内存分配。 memcpy(ptr, npy_data.data<double>(), data_row * data_col * sizeof(double));

C++;::如何捕获由void函数创建的矩阵 我通常用Python编码,但由于组合爆炸,我决定用C++来解决问题。我的想法是将NUMPY数组保存在NPY文件中,然后我将输入NPY文件的C++函数。由于我对C++指针和引用的理解有限,我无法总结如何获取空虚函数的值。void函数没有返回任何内容,所以我不能使用通常的赋值操作。如何将新的(&mat_out)赋值给我想要的变量,比如A。或者通过返回值(如第二个注释函数)的另一种方式,但是在这种方法中,我遇到了类型不匹配的问题。我的主要问题是如何使这两种方法中的任何一种都起作用。但从知识的角度来看,我也想知道如何利用在void函数中创建的新对象 #include <iostream> #include <Eigen/Dense> #include "cnpy.h" #include "opencv2/highgui.hpp" using namespace std; using namespace Eigen; using namespace cv; void cnpy2eigen(string data_fname, Eigen::MatrixXd& mat_out){ cnpy::NpyArray npy_data = cnpy::npy_load(data_fname); // double* ptr = npy_data.data<double>(); int data_row = npy_data.shape[0]; int data_col = npy_data.shape[1]; double* ptr = static_cast<double *>(malloc(data_row * data_col * sizeof(double))); memcpy(ptr, npy_data.data<double>(), data_row * data_col * sizeof(double)); cv::Mat dmat = cv::Mat(cv::Size(data_col, data_row), CV_64F, ptr); // CV_64F is equivalent double new (&mat_out) Eigen::Map<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>>(reinterpret_cast<double *>(dmat.data), data_col, data_row); } /* Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> > * cnpy2eigen(string data_fname){ cnpy::NpyArray npy_data = cnpy::npy_load(data_fname); // double* ptr = npy_data.data<double>(); int data_row = npy_data.shape[0]; int data_col = npy_data.shape[1]; double* ptr = static_cast<double *>(malloc(data_row * data_col * sizeof(double))); memcpy(ptr, npy_data.data<double>(), data_row * data_col * sizeof(double)); cv::Mat dmat = cv::Mat(cv::Size(data_col, data_row), CV_64F, ptr); // CV_64F is equivalent double return new (&mat_out) Eigen::Map<Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>>(reinterpret_cast<double *>(dmat.data), data_col, data_row); } */ int main() { Eigen::MatrixXd& A = cnpy2eigen("/Users/osmanmamun/Play_Ground/C++_practice/bayesframe/X_data.npy", Eigen::MatrixXd& A); cout << "Here is the matrix A:\n" << A << endl; } #包括 #包括 #包括“cnpy.h” #包括“opencv2/highgui.hpp” 使用名称空间std; 使用名称空间特征; 使用名称空间cv; void cnpy2eigen(字符串数据名称,Eigen::MatrixXd和mat_out){ cnpy::NpyArray npy_数据=cnpy::npy_负载(数据名称); //double*ptr=npy_data.data(); int data_row=npy_data.shape[0]; int data_col=npy_data.shape[1]; double*ptr=静态(malloc(数据行*数据列*大小(双)); memcpy(ptr,npy_data.data(),data_row*data_col*sizeof(double)); cv::Mat dmat=cv::Mat(cv::Size(data_col,data_row),cv_64F,ptr);//cv_64F等于双精度 新建(&mat_out)特征::映射(重新解释转换(dmat.data)、数据列、数据行); } /* Eigen::Map*cnpy2eigen(字符串数据名称){ cnpy::NpyArray npy_数据=cnpy::npy_负载(数据名称); //double*ptr=npy_data.data(); int data_row=npy_data.shape[0]; int data_col=npy_data.shape[1]; double*ptr=静态(malloc(数据行*数据列*大小(双)); memcpy(ptr,npy_data.data(),data_row*data_col*sizeof(double)); cv::Mat dmat=cv::Mat(cv::Size(data_col,data_row),cv_64F,ptr);//cv_64F等于双精度 返回新的(&mat_out)特征::映射(重新解释转换(dmat.data)、数据列、数据行); } */ int main() { 艾根::MatrixXd&A=cnpy2eigen(“/Users/osmanmamun/Play\u Ground/C++\practice/bayesframe/X\u data.npy”,艾根::MatrixXd&A); 你发布的代码有太多问题了 #include <iostream> #include <Eigen/Dense> // minor remark: Often you just need <Eigen/Core> here #include "cnpy.h" #include "opencv2/highgui.hpp" // Do you actually need OpenCV here? using namespace std; using namespace Eigen; using namespace cv; >你是 Malc -ing数据,这里没有匹配的免费< /C>。首先,标准的“低级”C++将使用新< /C>和 Dele> (更好地使用 STD::vector < /代码>)。但是实际上你可以使用本征的内存分配。 memcpy(ptr, npy_data.data<double>(), data_row * data_col * sizeof(double));,c++,eigen,C++,Eigen,您是否在任何地方使用dmat?如果没有,请将其删除。还要注意,OpenCV使用行主存储(我假设numpy使用列主存储?) 以下是一个已修复/已清理的版本: void cnpy2eigen(std::string const& data_fname, Eigen::MatrixXd& mat_out){ cnpy::NpyArray npy_data = cnpy::npy_load(data_fname); double* ptr = npy_data.data&

您是否在任何地方使用
dmat
?如果没有,请将其删除。还要注意,OpenCV使用行主存储(我假设numpy使用列主存储?)

以下是一个已修复/已清理的版本:

void cnpy2eigen(std::string const& data_fname, Eigen::MatrixXd& mat_out){
    cnpy::NpyArray npy_data = cnpy::npy_load(data_fname);
    double* ptr = npy_data.data<double>();
    int data_row = npy_data.shape[0];
    int data_col = npy_data.shape[1];
    mat_out = Eigen::MatrixXd::Map(ptr, data_row, data_col); // assuming NumPy is column major
}
void cnpy2eigen(std::string const&data\u fname,Eigen::MatrixXd&mat\u out){
cnpy::NpyArray npy_数据=cnpy::npy_负载(数据名称);
double*ptr=npy_data.data();
int data_row=npy_data.shape[0];
int data_col=npy_data.shape[1];
mat_out=Eigen::MatrixXd::Map(ptr,data_row,data_col);//假设NumPy是主列
}
可以这样称呼:

int main()
{
   Eigen::MatrixXd A;
   cnpy2eigen("filename", A);
   std::cout << "Here is the matrix A:\n" << A << '\n';
}
int main()
{
   Eigen::MatrixXd A = cnpy2eigen("filename");
   std::cout << "Here is the matrix A:\n" << A << '\n';
}
intmain()
{
本征::矩阵xD A;
cnpy2eigen(“文件名”,A);

std::cout
new(&mat_out)Eigen::Map(…);
应该是
mat_out=Eigen::Map(…);
Eigen::Map*cnpy2eigen(string data_fname){…return new(&mat_out)Eigen::Map(…)}
应该是
Eigen Map-cnpy2eigen(string data_fname){…return Eigen Eigen::Map(…)}
对于您的个人记录,
new code>(&mat_out)你不需要使用什么东西,直到你对C++非常熟悉,甚至是你几乎从来没有用过的东西。写博客的人要么解决了一个非常有趣的问题,要么试图变得过于聪明,可能会在自己能力之上编码。谢谢你的详细回答。我的未来C++代码的外购是NEVE。污染全局命名空间。
这里是A(0,0):4.43772e-06.矩阵m的大小为836x32
。似乎大小与np数组相同,但元素已关闭。第一个元素为0.41135383。我认为它没有加载数据,只是显示了驻留在分配空间中的值。如何修复它?你能`std::cout它是打印为(0,0)的相同值吗.所以问题出在cnpy::npy_load()函数中,可能它实际上是
float
数据?(我不知道
cnpy
如何工作,也不知道它将如何处理。)
}
void cnpy2eigen(std::string const& data_fname, Eigen::MatrixXd& mat_out){
    cnpy::NpyArray npy_data = cnpy::npy_load(data_fname);
    double* ptr = npy_data.data<double>();
    int data_row = npy_data.shape[0];
    int data_col = npy_data.shape[1];
    mat_out = Eigen::MatrixXd::Map(ptr, data_row, data_col); // assuming NumPy is column major
}
int main()
{
   Eigen::MatrixXd A;
   cnpy2eigen("filename", A);
   std::cout << "Here is the matrix A:\n" << A << '\n';
}
Eigen::MatrixXd cnpy2eigen(std::string const& data_fname){
    cnpy::NpyArray npy_data = cnpy::npy_load(data_fname);
    double* ptr = npy_data.data<double>();
    int data_row = npy_data.shape[0];
    int data_col = npy_data.shape[1];
    return Eigen::MatrixXd::Map(ptr, data_row, data_col); // assuming NumPy is column major
}
int main()
{
   Eigen::MatrixXd A = cnpy2eigen("filename");
   std::cout << "Here is the matrix A:\n" << A << '\n';
}