Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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
C++ 平面内直线相交法的特征值消除_C++_Parallel Processing_Eigen - Fatal编程技术网

C++ 平面内直线相交法的特征值消除

C++ 平面内直线相交法的特征值消除,c++,parallel-processing,eigen,C++,Parallel Processing,Eigen,我正试图用特征值做一个方法。代码可以工作,但我想删除for循环(用于处理每个点)。目标是使此方法尽可能快地运行 输入:平面法线、平面点、直线SP0(3xN)、直线SP1(3xN) 输出:相互作用点(3xN) 点数为N 完整代码: void PlaneLineIntersect(const Vector3f &planeNormal, const Vector3f &planeP0, const Matrix3Xf &linesP0, const Matrix3Xf &

我正试图用特征值做一个方法。代码可以工作,但我想删除for循环(用于处理每个点)。目标是使此方法尽可能快地运行

  • 输入:平面法线、平面点、直线SP0(3xN)、直线SP1(3xN)
  • 输出:相互作用点(3xN)
  • 点数为N
完整代码:

void PlaneLineIntersect(const Vector3f &planeNormal, const Vector3f &planeP0, const Matrix3Xf &linesP0, const Matrix3Xf &linesP1, Matrix3Xf &I, float &t)
{   
    Matrix3Xf p0l0(linesP0.rows(), linesP0.cols());
    // ################################
    // ## HOW TO REMOVE THIS FOR (colwise?) ##
    for (int i = 0; i < linesP0.cols(); i++)
    {
        float denom = planeNormal.dot(linesP1.col(i) - linesP0.col(i));
        if (denom > 1e-6 || denom < -1e-6)          // há uma interseção
        {
            Vector3f p0l0 = planeP0 - linesP0.col(i);
            t = p0l0.dot(planeNormal) / denom;
            p0l0 = (t * (linesP1.col(i) - linesP0.col(i))) + linesP0.col(i);
            I.col(i) = p0l0;
        }
    }
}

int main(cli::array<System::String ^> ^args)
{
    int n = 1000;
    Eigen::Vector3f planeNormal = Eigen::Vector3f(0, 0, -1);
    Eigen::Vector3f planeP0 = Eigen::Vector3f(0, 0, 7);
    Eigen::Matrix3Xf linesP0 = Matrix3Xf::Random(3, n);
    Eigen::Matrix3Xf linesP1 = Matrix3Xf::Random(3, n);
    Eigen::Matrix3Xf I = Matrix3Xf::Zero(3, n);
    float t;

    high_resolution_clock::time_point t1 = high_resolution_clock::now();

#pragma omp parallel for
    for (int i = 0; i < 100; i++)
        PlaneLineIntersect(planeNormal, planeP0, linesP0, linesP1, I, t);

    high_resolution_clock::time_point t2 = high_resolution_clock::now();
    double duration = (double) (duration_cast<microseconds>(t2 - t1).count());
    cout << "\nTempo total = " << duration / 1000 << " ms" << endl;
    cout << "\nTempo / ponto = " << duration / (n * 100) << " us\n" << endl;

    system("pause");
    return 0;
void PlaneLineIntersect(常数向量3F和平面法线、常数向量3F和平面P0、常数矩阵x3xF和直线SP0、常数矩阵x3xF和直线SP1、矩阵x3xF和I、浮点和t)
{   
矩阵x3xf p0l0(linesP0.rows(),linesP0.cols());
// ################################
//##如何为(colwise?)##
对于(int i=0;i1e-6 | | denom<-1e-6)//háuma intersuço
{
向量3f p0l0=平面p0-直线p0.col(i);
t=p0l0.圆点(平面法线)/denom;
p0l0=(t*(linesP1.col(i)-linesP0.col(i))+linesP0.col(i);
I.col(I)=p0l0;
}
}
}
int main(cli::数组^args)
{
int n=1000;
本征::向量3f平面法线=本征::向量3f(0,0,-1);
本征::向量3f平面P0=本征::向量3f(0,0,7);
本征::矩阵x3xf linesP0=矩阵x3xf::随机(3,n);
本征::Matrix3Xf linesP1=Matrix3Xf::随机(3,n);
本征::Matrix3Xf I=Matrix3Xf::零(3,n);
浮动t;
高分辨率时钟::时间点t1=高分辨率时钟::现在();
#pragma-omp并行
对于(int i=0;i<100;i++)
平面线相交(平面法线、平面P0、直线SP0、直线SP1、I、t);
高分辨率时钟::时间点t2=高分辨率时钟::现在();
双倍持续时间=(双倍)(持续时间(t2-t1).count());

难道
denom
的计算基本上就是
RowVectorXf denom=planeNormal.transpose()*(linesP1-linesP0);
对于其余部分:您希望
I
abs(denom)的列中是什么@chtz我们几乎要解决这个问题了,我们被困在一个代码行上,你能看一下吗:
denom
的计算基本上就是
RowVectorXf denom=planeNormal.transpose()*(linesP1-linesP0);
剩下的部分:你希望
I
abs(denom)的列上是什么@chtz我们几乎解决了这个问题,我们被困在一个代码行上,你能看一下吗: