Performance 利用特征值法实现球坐标到笛卡尔坐标的高效转换 我需要用C++库将坐标从球面变换到笛卡尔空间。以下代码用于此目的 const int size = 1000; Eigen::Array<std::pair<float, float>, Eigen::Dynamic, 1> direction(size); for(int i=0; i<direction.size();i++) { direction(i).first = (i+10)%360; // some value for this example (denoting the azimuth angle) direction(i).second = (i+20)%360; // some value for this example (denoting the elevation angle) } SSPL::MatrixX<T1> transformedMatrix(3, direction.size()); for(int i=0; i<transformedMatrix.cols(); i++) { const T1 azimuthAngle = direction(i).first*M_PI/180; //converting to radians const T1 elevationAngle = direction(i).second*M_PI/180; //converting to radians transformedMatrix(0,i) = std::cos(azimuthAngle)*std::cos(elevationAngle); transformedMatrix(1,i) = std::sin(azimuthAngle)*std::cos(elevationAngle); transformedMatrix(2,i) = std::sin(elevationAngle); } const int size=1000; 本征::阵列方向(大小); 对于(int i=0;i

Performance 利用特征值法实现球坐标到笛卡尔坐标的高效转换 我需要用C++库将坐标从球面变换到笛卡尔空间。以下代码用于此目的 const int size = 1000; Eigen::Array<std::pair<float, float>, Eigen::Dynamic, 1> direction(size); for(int i=0; i<direction.size();i++) { direction(i).first = (i+10)%360; // some value for this example (denoting the azimuth angle) direction(i).second = (i+20)%360; // some value for this example (denoting the elevation angle) } SSPL::MatrixX<T1> transformedMatrix(3, direction.size()); for(int i=0; i<transformedMatrix.cols(); i++) { const T1 azimuthAngle = direction(i).first*M_PI/180; //converting to radians const T1 elevationAngle = direction(i).second*M_PI/180; //converting to radians transformedMatrix(0,i) = std::cos(azimuthAngle)*std::cos(elevationAngle); transformedMatrix(1,i) = std::sin(azimuthAngle)*std::cos(elevationAngle); transformedMatrix(2,i) = std::sin(elevationAngle); } const int size=1000; 本征::阵列方向(大小); 对于(int i=0;i,performance,c++11,eigen,Performance,C++11,Eigen,,您至少可以使用正弦/余弦的矢量化版本: void dir2vector2(Eigen::Matrix3Xf& out, const Eigen::Array2Xf& in){ Eigen::Array2Xf sine = sin(in * (M_PI/180)); Eigen::Array2Xf cosi = cos(in * (M_PI/180)); out.resize(3, in.cols()); out << cosi.r

,您至少可以使用正弦/余弦的矢量化版本:

void dir2vector2(Eigen::Matrix3Xf& out, const Eigen::Array2Xf& in){
    Eigen::Array2Xf sine = sin(in * (M_PI/180));
    Eigen::Array2Xf cosi = cos(in * (M_PI/180));

    out.resize(3, in.cols());

    out << cosi.row(0) * cosi.row(1),
           sine.row(0) * cosi.row(1),
                         sine.row(1);
}
void dir2vector2(本征::矩阵x3xf&out,常数本征::数组y2xf&in){
本征::Array2Xf sine=sin(in*(M_PI/180));
本征::Array2Xf cosi=cos(in*(M_PI/180));
out.resize(3,in.cols());

谢谢你给我关于矢量化的提示。我也很想看看是否可以通过使用Eigen提供的“几何图形”来提高性能!