Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.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++;基于特征矩阵库的代码翻译 我有下面的代码,我用C++来翻译成C++。p> template <typename PointT> inline unsigned int pcl::SamplingSurfaceNormal<PointT>::computeMeanAndCovarianceMatrix (const pcl::PointCloud<PointT> &cloud, Eigen::Matrix3f &covariance_matrix, Eigen::Vector4f &centroid) { // create the buffer on the stack which is much faster than using cloud.points[indices[i]] and centroid as a buffer Eigen::Matrix<float, 1, 9, Eigen::RowMajor> accu = Eigen::Matrix<float, 1, 9, Eigen::RowMajor>::Zero (); std::size_t point_count = 0; for (std::size_t i = 0; i < cloud.points.size (); i++) { if (!isFinite (cloud[i])) { continue; } ++point_count; accu [0] += cloud[i].x * cloud[i].x; accu [1] += cloud[i].x * cloud[i].y; accu [2] += cloud[i].x * cloud[i].z; accu [3] += cloud[i].y * cloud[i].y; // 4 accu [4] += cloud[i].y * cloud[i].z; // 5 accu [5] += cloud[i].z * cloud[i].z; // 8 accu [6] += cloud[i].x; accu [7] += cloud[i].y; accu [8] += cloud[i].z; } accu /= static_cast<float> (point_count); centroid[0] = accu[6]; centroid[1] = accu[7]; centroid[2] = accu[8]; centroid[3] = 0; covariance_matrix.coeffRef (0) = accu [0] - accu [6] * accu [6]; covariance_matrix.coeffRef (1) = accu [1] - accu [6] * accu [7]; covariance_matrix.coeffRef (2) = accu [2] - accu [6] * accu [8]; covariance_matrix.coeffRef (4) = accu [3] - accu [7] * accu [7]; covariance_matrix.coeffRef (5) = accu [4] - accu [7] * accu [8]; covariance_matrix.coeffRef (8) = accu [5] - accu [8] * accu [8]; covariance_matrix.coeffRef (3) = covariance_matrix.coeff (1); covariance_matrix.coeffRef (6) = covariance_matrix.coeff (2); covariance_matrix.coeffRef (7) = covariance_matrix.coeff (5); return (static_cast<unsigned int> (point_count)); }_C#_C++_Eigen - Fatal编程技术网

C# C++;基于特征矩阵库的代码翻译 我有下面的代码,我用C++来翻译成C++。p> template <typename PointT> inline unsigned int pcl::SamplingSurfaceNormal<PointT>::computeMeanAndCovarianceMatrix (const pcl::PointCloud<PointT> &cloud, Eigen::Matrix3f &covariance_matrix, Eigen::Vector4f &centroid) { // create the buffer on the stack which is much faster than using cloud.points[indices[i]] and centroid as a buffer Eigen::Matrix<float, 1, 9, Eigen::RowMajor> accu = Eigen::Matrix<float, 1, 9, Eigen::RowMajor>::Zero (); std::size_t point_count = 0; for (std::size_t i = 0; i < cloud.points.size (); i++) { if (!isFinite (cloud[i])) { continue; } ++point_count; accu [0] += cloud[i].x * cloud[i].x; accu [1] += cloud[i].x * cloud[i].y; accu [2] += cloud[i].x * cloud[i].z; accu [3] += cloud[i].y * cloud[i].y; // 4 accu [4] += cloud[i].y * cloud[i].z; // 5 accu [5] += cloud[i].z * cloud[i].z; // 8 accu [6] += cloud[i].x; accu [7] += cloud[i].y; accu [8] += cloud[i].z; } accu /= static_cast<float> (point_count); centroid[0] = accu[6]; centroid[1] = accu[7]; centroid[2] = accu[8]; centroid[3] = 0; covariance_matrix.coeffRef (0) = accu [0] - accu [6] * accu [6]; covariance_matrix.coeffRef (1) = accu [1] - accu [6] * accu [7]; covariance_matrix.coeffRef (2) = accu [2] - accu [6] * accu [8]; covariance_matrix.coeffRef (4) = accu [3] - accu [7] * accu [7]; covariance_matrix.coeffRef (5) = accu [4] - accu [7] * accu [8]; covariance_matrix.coeffRef (8) = accu [5] - accu [8] * accu [8]; covariance_matrix.coeffRef (3) = covariance_matrix.coeff (1); covariance_matrix.coeffRef (6) = covariance_matrix.coeff (2); covariance_matrix.coeffRef (7) = covariance_matrix.coeff (5); return (static_cast<unsigned int> (point_count)); }

C# C++;基于特征矩阵库的代码翻译 我有下面的代码,我用C++来翻译成C++。p> template <typename PointT> inline unsigned int pcl::SamplingSurfaceNormal<PointT>::computeMeanAndCovarianceMatrix (const pcl::PointCloud<PointT> &cloud, Eigen::Matrix3f &covariance_matrix, Eigen::Vector4f &centroid) { // create the buffer on the stack which is much faster than using cloud.points[indices[i]] and centroid as a buffer Eigen::Matrix<float, 1, 9, Eigen::RowMajor> accu = Eigen::Matrix<float, 1, 9, Eigen::RowMajor>::Zero (); std::size_t point_count = 0; for (std::size_t i = 0; i < cloud.points.size (); i++) { if (!isFinite (cloud[i])) { continue; } ++point_count; accu [0] += cloud[i].x * cloud[i].x; accu [1] += cloud[i].x * cloud[i].y; accu [2] += cloud[i].x * cloud[i].z; accu [3] += cloud[i].y * cloud[i].y; // 4 accu [4] += cloud[i].y * cloud[i].z; // 5 accu [5] += cloud[i].z * cloud[i].z; // 8 accu [6] += cloud[i].x; accu [7] += cloud[i].y; accu [8] += cloud[i].z; } accu /= static_cast<float> (point_count); centroid[0] = accu[6]; centroid[1] = accu[7]; centroid[2] = accu[8]; centroid[3] = 0; covariance_matrix.coeffRef (0) = accu [0] - accu [6] * accu [6]; covariance_matrix.coeffRef (1) = accu [1] - accu [6] * accu [7]; covariance_matrix.coeffRef (2) = accu [2] - accu [6] * accu [8]; covariance_matrix.coeffRef (4) = accu [3] - accu [7] * accu [7]; covariance_matrix.coeffRef (5) = accu [4] - accu [7] * accu [8]; covariance_matrix.coeffRef (8) = accu [5] - accu [8] * accu [8]; covariance_matrix.coeffRef (3) = covariance_matrix.coeff (1); covariance_matrix.coeffRef (6) = covariance_matrix.coeff (2); covariance_matrix.coeffRef (7) = covariance_matrix.coeff (5); return (static_cast<unsigned int> (point_count)); },c#,c++,eigen,C#,C++,Eigen,看吧 coeffRef只提供对底层数据数组的访问。因此,对协方差矩阵[i,j]的转换应该是等价的。请注意,表达式协方差矩阵.coeffRef(k)只给出了数据数组中的k第th个元素,与存储顺序无关。是的,对于原始代码来说,使用coeffRef(i,j),IMO会更有意义 之所以会出现这种情况(我在这里猜测,ggael和chtz可能能够确认/反驳),是因为Eigen使用了大量表达式模板来确定何时以及如何计算表达式的一部分。有些依赖于矩阵的存储顺序,有些则不然。在不依赖于存储顺序(例如标量*矩阵)的

看吧

coeffRef
只提供对底层数据数组的访问。因此,对协方差矩阵[i,j]的转换应该是等价的。请注意,表达式
协方差矩阵.coeffRef(k)
只给出了数据数组中的
k
第th个元素,与存储顺序无关。是的,对于原始代码来说,使用
coeffRef(i,j)
,IMO会更有意义


之所以会出现这种情况(我在这里猜测,ggael和chtz可能能够确认/反驳),是因为Eigen使用了大量表达式模板来确定何时以及如何计算表达式的一部分。有些依赖于矩阵的存储顺序,有些则不然。在不依赖于存储顺序(例如标量*矩阵)的情况下,表达式可以“短路”,从而减少编译器为决定如何计算给定表达式而必须经历的步骤数量,从而减少编译时间。如果我们显式地声明
coeffRef
,那么我们会告诉编译器,我们谈论的是一个具有存储的具体对象,而不是一个表达式。

是的,但是“这是一个重载版本的DenseCoeffsBase::coeffRef(Index)const,用于绕过表达式求值器的创建,从而节省了编译工作。有关详细信息,请参见DenseCoeffsBase::coeffRef(Index)const.`mean?我想知道它从矩阵中得到了什么功能。我假设它假设矩阵是RowMajor,并相应地检索值,但就我所知,这是绝对没有写的,而且我已经查看了同样不透明的源代码…是否有特定的原因将其移植到C#而不是将其作为dll调用?是的,我只需要代码的一小部分,不需要包装这个类的开销,因为它有一个复杂的依赖层次结构。
private int ComputeMeanAndCovarianceMatrix(
    PointCloud cloud,
    Matrix<float> covariance_matrix,
    MathNet.Numerics.LinearAlgebra.Vector<float> centroid)
{
    int point_count = 0;
    Matrix<float> accu = Matrix<float>.Build.DenseOfRowMajor(1, 9, Enumerable.Repeat(0.0f, 9));

    for (int i = 0; i < cloud.Vertices.Length; ++i)
    {
        //if (!isFinite(cloud.Vertices[i].Point.))
        //{
        //  continue;
        //}

        ++point_count;
        accu[0, 0] += cloud.Vertices[i].Point.X * cloud.Vertices[i].Point.X;
        accu[0, 1] += cloud.Vertices[i].Point.X * cloud.Vertices[i].Point.Y;
        accu[0, 2] += cloud.Vertices[i].Point.X * cloud.Vertices[i].Point.Z;
        accu[0, 3] += cloud.Vertices[i].Point.Y * cloud.Vertices[i].Point.Y; // 4
        accu[0, 4] += cloud.Vertices[i].Point.Y * cloud.Vertices[i].Point.Z; // 5
        accu[0, 5] += cloud.Vertices[i].Point.Z * cloud.Vertices[i].Point.Z; // 8
        accu[0, 6] += cloud.Vertices[i].Point.X;
        accu[0, 7] += cloud.Vertices[i].Point.Y;
        accu[0, 8] += cloud.Vertices[i].Point.Z;
    }
    accu /= point_count;

    centroid[0] = accu[0, 6];
    centroid[1] = accu[0, 7];
    centroid[2] = accu[0, 8];
    centroid[3] = 0;

    covariance_matrix[0, 0] = accu[0, 0] - accu[0, 6] * accu[0, 6];
    covariance_matrix[0, 1] = accu[0, 1] - accu[0, 6] * accu[0, 7];
    covariance_matrix[0, 2] = accu[0, 2] - accu[0, 6] * accu[0, 8];
    covariance_matrix[1, 1] = accu[0, 3] - accu[0, 7] * accu[0, 7];
    covariance_matrix[1, 2] = accu[0, 4] - accu[0, 7] * accu[0, 8];
    covariance_matrix[2, 2] = accu[0, 5] - accu[0, 8] * accu[0, 8];
    covariance_matrix[1, 0] = covariance_matrix[0, 1];
    covariance_matrix[2, 0] = covariance_matrix[0, 2];
    covariance_matrix[2, 1] = covariance_matrix[1, 2];

    return point_count;
}