Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy方法对应于C++;本征碰撞 我有一个NUMPY算法需要用Eigen来翻译C++。p> # D is a 20001x13 matrix stacked from Dva and Dvb, then multiply by w_f. # dtype=complex<double> D = np.column_stack((Dva, Dvb)) * w_f.reshape((20001, 1)) * np.ones((1, 13)) R = np.dot(D.conj().T, D) 引发异常“0xC000 000 FD:堆栈溢出”。 < P>首先,您应该在C++代码中几乎不与新< /代码>一起工作。大部分时间使用本地对象(或std::vector),必要时使用智能指针,如std::unique\u ptr或std::shared\u ptr_C++_Python 3.x_Numpy_Eigen - Fatal编程技术网

Python Numpy方法对应于C++;本征碰撞 我有一个NUMPY算法需要用Eigen来翻译C++。p> # D is a 20001x13 matrix stacked from Dva and Dvb, then multiply by w_f. # dtype=complex<double> D = np.column_stack((Dva, Dvb)) * w_f.reshape((20001, 1)) * np.ones((1, 13)) R = np.dot(D.conj().T, D) 引发异常“0xC000 000 FD:堆栈溢出”。 < P>首先,您应该在C++代码中几乎不与新< /代码>一起工作。大部分时间使用本地对象(或std::vector),必要时使用智能指针,如std::unique\u ptr或std::shared\u ptr

Python Numpy方法对应于C++;本征碰撞 我有一个NUMPY算法需要用Eigen来翻译C++。p> # D is a 20001x13 matrix stacked from Dva and Dvb, then multiply by w_f. # dtype=complex<double> D = np.column_stack((Dva, Dvb)) * w_f.reshape((20001, 1)) * np.ones((1, 13)) R = np.dot(D.conj().T, D) 引发异常“0xC000 000 FD:堆栈溢出”。 < P>首先,您应该在C++代码中几乎不与新< /代码>一起工作。大部分时间使用本地对象(或std::vector),必要时使用智能指针,如std::unique\u ptr或std::shared\u ptr,c++,python-3.x,numpy,eigen,C++,Python 3.x,Numpy,Eigen,关于问题的特征部分,避免使用非常大的固定大小矩阵(超过几KiB)。您可以将一个维度设置为固定维度,另一个维度设置为动态维度。最后,避免将auto与Eigen结合使用,除非您知道自己在做什么 以下几点应该行得通。我用相应的特征函数替换了所有的循环,并通过直接使用对角矩阵进行乘积来避免临时性。或者,您可以使用矩阵执行cwiseProduct typedef特征::矩阵向量xcd; 类型定义特征::矩阵矩阵XX13CD; 类型定义特征::矩阵矩阵XX7CD; typedef特征::矩阵矩阵xx6cd;

关于问题的特征部分,避免使用非常大的固定大小矩阵(超过几KiB)。您可以将一个维度设置为固定维度,另一个维度设置为动态维度。最后,避免将
auto
与Eigen结合使用,除非您知道自己在做什么

以下几点应该行得通。我用相应的特征函数替换了所有的循环,并通过直接使用对角矩阵进行乘积来避免临时性。或者,您可以使用矩阵执行
cwiseProduct

typedef特征::矩阵向量xcd;
类型定义特征::矩阵矩阵XX13CD;
类型定义特征::矩阵矩阵XX7CD;
typedef特征::矩阵矩阵xx6cd;
typedef特征::矩阵矩阵13cd;
MatrixX7cd-Dva(20001,7);
MatrixX6cd Dvb(20001,6);
设置零();设置零();
矩阵13CD D(20001,13);
D.leftCols(7).noalias()=VectorXcd::Map(wf.data(),wf.size()).asDiagonal()*Dva;
D.rightCols(6).noalias()=VectorXcd::Map(wf.data(),wf.size()).asDiagonal()*Dvb;
矩阵13cd R=D.转置()*D;

<>代码>首先,你应该在C++代码中几乎不使用<代码>新< /代码>。大部分时间使用本地对象(或
std::vector
),必要时使用智能指针,如
std::unique\u ptr
std::shared\u ptr

关于问题的特征部分,避免使用非常大的固定大小矩阵(超过几KiB)。您可以将一个维度设置为固定维度,另一个维度设置为动态维度。最后,避免将
auto
与Eigen结合使用,除非您知道自己在做什么

以下几点应该行得通。我用相应的特征函数替换了所有的循环,并通过直接使用对角矩阵进行乘积来避免临时性。或者,您可以使用矩阵执行
cwiseProduct

typedef特征::矩阵向量xcd;
类型定义特征::矩阵矩阵XX13CD;
类型定义特征::矩阵矩阵XX7CD;
typedef特征::矩阵矩阵xx6cd;
typedef特征::矩阵矩阵13cd;
MatrixX7cd-Dva(20001,7);
MatrixX6cd Dvb(20001,6);
设置零();设置零();
矩阵13CD D(20001,13);
D.leftCols(7).noalias()=VectorXcd::Map(wf.data(),wf.size()).asDiagonal()*Dva;
D.rightCols(6).noalias()=VectorXcd::Map(wf.data(),wf.size()).asDiagonal()*Dvb;
矩阵13cd R=D.转置()*D;

在尝试使用指针之前,您是否让指针指向任何东西?这已经是未定义的行为,除非您以某种方式初始化
tmp\u 1
(*tmp\u 1)(i,j)=wf[i]
。请提供一个(即,包括所有
#包括
和函数签名,并且没有
..
遗漏!还有,您是否有任何理由将所有内容都称为指针?
&tmp_1->cwiseProduct(*tmp_2)
不应编译,因为您使用了临时的地址:抱歉,我忘记为tmp_1和tmp_2编写内存分配表达式。我已经更新了它们。在尝试使用它们之前,您是否让指针指向任何东西?这已经是未定义的行为,除非您以某种方式初始化了
tmp_1
(*tmp_1)(I,j)=wf[i]
。请提供一个(即,包括所有
\include
和函数签名,并且没有
..
遗漏!还有,您是否有任何理由将所有内容都称为指针?
&tmp\u 1->cwiseProduct(*tmp\u 2)
不应编译,因为您使用了一个临时的地址:抱歉,我忘记为tmp_1和tmp_2编写内存分配表达式。我已经更新了它们。
#include <Eigen/Core>
#include <Eigen/Dense>
#include <vector>
#include <complex>

using namespace std;

typedef complex<double> dcomplex;

void foo()
{
    vector<dcomplex> wf;
    wf.resize(20001);
    Eigen::Matrix<dcomplex, 20001, 13> *tmp_1 = new Eigen::Matrix<dcomplex, 20001, 13>;
    Eigen::Matrix<dcomplex, 20001, 13> *tmp_2 = new Eigen::Matrix<dcomplex, 20001, 13>;
    Eigen::Matrix<dcomplex, 20001, 7> *Dva = new Eigen::Matrix<dcomplex, 20001, 7>;
    Eigen::Matrix<dcomplex, 20001, 6> *Dvb = new Eigen::Matrix<dcomplex, 20001, 6>;

    for (int i = 0; i < 20001; i++){
        for (int j = 0; j < 7; j++)
            (*Dva)(i, j) = 0;
        for (int j = 0; j < 6; j++)
            (*Dvb)(i, j) = 0;
        for (int j = 0; j < 13; j++)
            (*tmp_2)(i, j) = wf[i];
    }
    *tmp_1 << *Dva, *Dvb;
    auto *D = &tmp_1->cwiseProduct(*tmp_2);

    auto R = (D->transpose() * (*D));
    R(0,0);
}
R.rows() == 13;  // true
R.cols() == 13;  // true
R(0, 0);  // or what ever makes it crash
typedef Eigen::Matrix<dcomplex, Eigen::Dynamic,1> VectorXcd;
typedef Eigen::Matrix<dcomplex, Eigen::Dynamic,13> MatrixX13cd;
typedef Eigen::Matrix<dcomplex, Eigen::Dynamic,7> MatrixX7cd;
typedef Eigen::Matrix<dcomplex, Eigen::Dynamic,6> MatrixX6cd;
typedef Eigen::Matrix<dcomplex, 13,13> Matrix13cd;


MatrixX7cd  Dva(20001,  7);
MatrixX6cd  Dvb(20001,  6);

Dva.setZero(); Dvb.setZero();
MatrixX13cd D(20001, 13);
D.leftCols(7).noalias()  = VectorXcd::Map(wf.data(), wf.size()).asDiagonal() * Dva;
D.rightCols(6).noalias() = VectorXcd::Map(wf.data(), wf.size()).asDiagonal() * Dvb;

Matrix13cd R = D.transpose() * D;