Eigen::ArrayXXd windows(D * H * W * anchors.size(), 6); //Eigen::MatrixXd windows(D * H * W * anchors.size(), 6); int index = 0; Eigen::VectorXd oz(D), oh(H), ow(W); for (int z = 0; z < D; ++z) { oz[z] = offset + z * stride; } for (int y = 0; y < H; ++y) { oh[y] = offset + y * stride; } for (int x = 0; x < W; ++x) { ow[x] = offset + x * stride; } // 计算 anchor box 的坐标 for (int z = 0; z < D; ++z) { for (int y = 0; y < H; ++y) { for (int x = 0; x < W; ++x) { for (int a = 0; a < anchors.size(); ++a) { windows.row(index) << oz[z], oh[y], ow[x], anchors[a][0], anchors[a][1], anchors[a][2]; ++index; } } } } return windows;
时间: 2024-04-26 14:25:52 浏览: 83
这段代码是目标检测中计算所有 anchor boxes 的位置和大小的函数。首先,代码定义了一个 Eigen::ArrayXXd 类型的矩阵 windows,用于存储所有 anchor boxes 的位置和大小信息。矩阵的行数为 D * H * W * anchors.size(),表示总共有这么多个 anchor boxes,每个 anchor box 的信息包含 6 个数值,分别是它的中心坐标 (oz, oh, ow) 和宽高比 (w, h, aspect_ratio)。
接下来,代码通过三个循环分别计算 D、H 和 W 个方向上 anchor boxes 的中心坐标。其中,offset 表示特征图的起始位置,stride 表示每个 anchor box 的步长。假设特征图的大小为 DxHxW,anchor box 的数量为 N,那么这三个循环的时间复杂度为 O(DxHxW)。
最后,代码通过四重循环枚举所有可能的空间位置和 anchor box,计算每个 anchor box 的中心坐标和宽高,将它们存储在矩阵 windows 中,并返回该矩阵。这四重循环的时间复杂度为 O(DxHxWxN),其中 N 表示 anchor box 的数量。因此,该函数的总时间复杂度为 O(DxHxWxN)。
相关问题
/usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_gemm_kernel.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h /usr/local/include/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h /usr/local/include/eigen3/Eigen/src/SparseQR/SparseQR.h /usr/local/include/eigen3/Eigen/src/StlSupport/StdDeque.h /usr/local/include/eigen3/Eigen/src/StlSupport/StdList.h /usr/local/include/eigen3/Eigen/src/StlSupport/StdVector.h /usr/local/include/eigen3/Eigen/src/StlSupport/details.h /usr/local/include/eigen3/Eigen/src/SuperLUSupport/SuperLUSupport.h /usr/local/include/eigen3/Eigen/src/UmfPackSupport/UmfPackSupport.h /usr/local/include/eigen3/Eigen/src/misc/Image.h /usr/local/include/eigen3/Eigen/src/misc/Kernel.h /usr/local/include/eigen3/Eigen/src/misc/RealSvd2x2.h /usr/local/include/eigen3/Eigen/src/misc/blas.h /usr/local/include/eigen3/Eigen/src/misc/lapack.h /usr/local/include/eigen3/Eigen/src/misc/lapacke.h /usr/local/include/eigen3/Eigen/src/misc/lapacke_mangling.h /usr/local/include/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.h /usr/local/include/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.h /usr/local/include/eigen3/Eigen/src/plugins/BlockMethods.h /usr/local/include/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.h /usr/local/include/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.h /usr/local/include/eigen3/Eigen/src/plugins/IndexedViewMethods.h /usr/local/include/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.h /usr/local/include/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.h /usr/local/include/eigen3/Eigen/src/plugins/ReshapedMethods.h /usr/local/include/eigen3/unsupported/Eigen /usr/local/include/eigen3/unsupported/Eigen/AdolcForward /usr/local/include/eigen3/unsupported/Eigen/AlignedVector3 /usr/local/include/eigen3/unsupported/Eigen/ArpackSupport /usr/local/include/eigen3/unsupported/Eigen/AutoDiff /usr/local/include/eigen3/unsupported/Eigen/BVH /usr/local/include/eigen3/unsupported/Eigen/CXX11 /usr/local/include/eigen3/unsupported/Eigen/EulerAngles /usr/local/include/eigen3/unsupported/Eigen/FFT /usr/local/include/eigen3/unsupported/Eigen/IterativeSolvers /usr/local/include/eigen3/unsupported/Eigen/KroneckerProduct /usr/local/include/eigen3/unsupported/Eigen/LevenbergMarquardt /usr/local/include/eigen3/unsupported/Eigen/MPRealSupport /usr/local/include/eigen3/unsupported/Eigen/MatrixFunctions /usr/local/include/eigen3/unsupported/Eigen/MoreVectorization /usr/local/include/eigen3/unsupported/Eigen/NonLinearOptimization /usr/local/include/eigen3/unsupported/Eigen/NumericalDiff /usr/local/include/eigen3/unsupported/Eigen/OpenGLSupport /usr/local/include/eigen3/unsupported/Eigen/Polynomials /usr/local/include/eigen3/unsupported/Eigen/Skyline /usr/local/include/eigen3/unsupported/Eigen/SparseExtra /usr/local/include/eigen3/unsupported/Eigen/SpecialFunctions /usr/local/include/eigen3/unsupported/Eigen/Splines /usr/local/include/eigen3/unsupported/Eigen/src /usr/local/include/eigen3/unsupported/Eigen/CXX11/Tensor /usr/local/include/eigen3/unsupported/Eigen/CXX11/TensorSymmetry /usr/local/include/eigen3/unsupported/Eigen/CXX11/ThreadPool /usr/local/include/eigen3/unsupported/Eigen/CXX11/src /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/util /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/Tensor.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorBlock.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionGpu.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionSycl.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConvolutionSycl.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceGpu.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaDefines.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaUndefines.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReductionGpu.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReductionSycl.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorRef.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReverse.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorScan.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorScanSycl.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorShuffling.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorTraits.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorUInt128.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/DynamicSymmetry.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/StaticSymmetry.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/Symmetry.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/util /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/util/TemplateGroupTheory.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/Barrier.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/EventCount.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/RunQueue.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadCancel.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadEnvironment.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadLocal.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadPoolInterface.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadYield.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/util/CXX11Meta.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/util/CXX11Workarounds.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/util/EmulateArray.h /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/util/MaxSizeVector.h /usr/local/include/eigen3/unsupported/Eigen/src/AutoDiff /usr/local/include/eigen3/unsupported/Eigen/src/BVH /usr/local/include/eigen3/unsupported/Eigen/src/Eigenvalues /usr/local/include/eigen3/unsupported/Eigen/src/EulerAngles /usr/local/include/eigen3/unsupported/Eigen/src/FFT /usr/local/include/eigen3/unsupported/Eigen/src/IterativeSolvers /usr/local/include/eigen3/unsupported/Eigen/src/KroneckerProduct /usr/local/include/eigen3/unsupported/Eigen/src/LevenbergMarquardt /usr/local/include/eigen3/unsupported/Eigen/src/MatrixFunctions /usr/local/include/eigen3/unsupported/Eigen/src/MoreVectorization /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization /usr/local/include/eigen3/unsupported/Eigen/src/NumericalDiff /usr/local/include/eigen3/unsupported/Eigen/src/Polynomials /usr/local/include/eigen3/unsupported/Eigen/src/Skyline /usr/local/include/eigen3/unsupported/Eigen/src/SparseExtra /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions /usr/local/include/eigen3/unsupported/Eigen/src/Splines /usr/local/include/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h /usr/local/include/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h /usr/local/include/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffVector.h /usr/local/include/eigen3/unsupported/Eigen/src/BVH/BVAlgorithms.h /usr/local/include/eigen3/unsupported/Eigen/src/BVH/KdBVH.h /usr/local/include/eigen3/unsupported/Eigen/src/Eigenvalues/ArpackSelfAdjointEigenSolver.h /usr/local/include/eigen3/unsupported/Eigen/src/EulerAngles/EulerAngles.h /usr/local/include/eigen3/unsupported/Eigen/src/EulerAngles/EulerSystem.h /usr/local/include/eigen3/unsupported/Eigen/src/FFT/ei_fftw_impl.h /usr/local/include/eigen3/unsupported/Eigen/src/FFT/ei_kissfft_impl.h /usr/local/include/eigen3/unsupported/Eigen/src/IterativeSolvers/ConstrainedConjGrad.h /usr/local/include/eigen3/unsupported/Eigen/src/IterativeSolvers/DGMRES.h /usr/local/include/eigen3/unsupported/Eigen/src/IterativeSolvers/GMRES.h /usr/local/include/eigen3/unsupported/Eigen/src/IterativeSolvers/IDRS.h /usr/local/include/eigen3/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h /usr/local/include/eigen3/unsupported/Eigen/src/IterativeSolvers/IterationController.h /usr/local/include/eigen3/unsupported/Eigen/src/IterativeSolvers/MINRES.h /usr/local/include/eigen3/unsupported/Eigen/src/IterativeSolvers/Scaling.h /usr/local/include/eigen3/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h /usr/local/include/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMcovar.h /usr/local/include/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h /usr/local/include/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMpar.h /usr/local/include/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMqrsolv.h /usr/local/include/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LevenbergMarquardt.h /usr/local/include/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h /usr/local/include/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h /usr/local/include/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h /usr/local/include/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixPower.h /usr/local/include/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h /usr/local/include/eigen3/unsupported/Eigen/src/MatrixFunctions/StemFunction.h /usr/local/include/eigen3/unsupported/Eigen/src/MoreVectorization/MathFunctions.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/chkder.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/covar.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/dogleg.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/lmpar.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/r1updt.h /usr/local/include/eigen3/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h /usr/local/include/eigen3/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h /usr/local/include/eigen3/unsupported/Eigen/src/Polynomials/Companion.h /usr/local/include/eigen3/unsupported/Eigen/src/Polynomials/PolynomialSolver.h /usr/local/include/eigen3/unsupported/Eigen/src/Polynomials/PolynomialUtils.h /usr/local/include/eigen3/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h /usr/local/include/eigen3/unsupported/Eigen/src/Skyline/SkylineMatrix.h /usr/local/include/eigen3/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h /usr/local/include/eigen3/unsupported/Eigen/src/Skyline/SkylineProduct.h /usr/local/include/eigen3/unsupported/Eigen/src/Skyline/SkylineStorage.h /usr/local/include/eigen3/unsupported/Eigen/src/Skyline/SkylineUtil.h /usr/local/include/eigen3/unsupported/Eigen/src/SparseExtra/BlockOfDynamicSparseMatrix.h /usr/local/include/eigen3/unsupported/Eigen/src/SparseExtra/BlockSparseMatrix.h /usr/local/include/eigen3/unsupported/Eigen/src/SparseExtra/DynamicSparseMatrix.h /usr/local/include/eigen3/unsupported/Eigen/src/SparseExtra/MarketIO.h /usr/local/include/eigen3/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h /usr/local/include/eigen3/unsupported/Eigen/src/SparseExtra/RandomSetter.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsArrayAPI.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsBFloat16.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsFunctors.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsHalf.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsImpl.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsPacketMath.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/HipVectorCompatibility.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsArrayAPI.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsBFloat16.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsFunctors.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsHalf.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsPacketMath.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/AVX /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/AVX512 /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/GPU /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/NEON /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/AVX/BesselFunctions.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/AVX/SpecialFunctions.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/AVX512/BesselFunctions.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/AVX512/SpecialFunctions.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/GPU/SpecialFunctions.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/NEON/BesselFunctions.h /usr/local/include/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/NEON/SpecialFunctions.h /usr/local/include/eigen3/unsupported/Eigen/src/Splines/Spline.h /usr/local/include/eigen3/unsupported/Eigen/src/Splines/SplineFitting.h /usr/local/include/eigen3/unsupported/Eigen/src/Splines/SplineFwd.h ishtar@ubuntu:~/mbplanner_ws$
<think>我们正在讨论Eigen3库的安装路径和头文件位置。根据引用[1]和[2],Eigen3通常安装在`/usr/include/eigen3`或`/usr/local/include/eigen3`目录下。用户询问的具体路径`/usr/local/include/eigen3/Eigen/`是Eigen库的核心头文件目录,而`unsupported`目录则包含一些实验性的或尚未正式纳入主干的模块。
### 1. Eigen3头文件路径说明
- **标准安装路径**:
- Ubuntu系统通过`apt`安装的Eigen3通常位于:
```bash
/usr/include/eigen3
```
- 手动从源码编译安装的Eigen3则通常位于:
```bash
/usr/local/include/eigen3
```
- **核心头文件位置**:
- 核心模块(Eigen/Core, Eigen/Dense等)位于:
```bash
/usr/local/include/eigen3/Eigen # 手动安装示例
```
或
```bash
/usr/include/eigen3/Eigen # 系统包安装示例
```
- **非官方模块位置**:
- 实验性模块(如自动微分、矩阵函数等)位于:
```bash
/usr/local/include/eigen3/unsupported # 手动安装
```
或
```bash
/usr/include/eigen3/unsupported # 系统包安装
```
### 2. `unsupported`目录内容
`unsupported`目录包含尚未被官方正式支持的模块,这些模块可能处于开发阶段或需要用户反馈。常见内容如下:
| 模块路径 | 功能描述 |
|---------|----------|
| `Eigen/AdolcForward` | 用于Adol-C自动微分库的接口 |
| `Eigen/AlignedVector3` | 对齐的3D向量 |
| `Eigen/ArpackSupport` | ARPACK特征值求解器封装 |
| `Eigen/AutoDiff` | 自动微分(基础实现) |
| `Eigen/BVH` | 包围体层次结构(用于几何查询) |
| `Eigen/EulerAngles` | 欧拉角转换工具 |
| `Eigen/FFT` | 快速傅里叶变换 |
| `Eigen/IterativeSolvers` | 迭代线性系统求解器增强 |
| `Eigen/KroneckerProduct` | 克罗内克积运算 |
| `Eigen/LevenbergMarquardt` | 非线性最小二乘优化(Levenberg-Marquardt) |
| `Eigen/MatrixFunctions` | 矩阵指数、对数等函数 |
| `Eigen/MoreVectorization` | 增强的向量化指令 |
| `Eigen/MPRealSupport` | mpreal多精度浮点库支持 |
| `Eigen/NonLinearOptimization` | 非线性优化算法 |
| `Eigen/NumericalDiff` | 数值微分 |
| `Eigen/OpenGLSupport` | OpenGL矩阵交互工具 |
| `Eigen/Polynomials` | 多项式操作与求解 |
| `Eigen/Skyline` | Skyline矩阵存储(带状矩阵变种) |
| `Eigen/SparseExtra` | 稀疏矩阵附加功能 |
| `Eigen/SpecialFunctions` | 特殊数学函数(如伽马函数) |
| `Eigen/Splines` | 样条曲线插值 |
> 注意:这些模块的API可能不稳定,使用时需谨慎。
### 3. 路径验证方法
检查头文件是否存在:
```bash
# 检查核心头文件
ls /usr/local/include/eigen3/Eigen
# 检查非官方模块
ls /usr/local/include/eigen3/unsupported/Eigen
```
### 4. 配置建议(解决编译问题)
若编译器报错找不到Eigen头文件,参考引用[1][^1][^2]的解决方案:
```bash
# 方法1:建立符号链接(适用于手动安装)
sudo ln -s /usr/local/include/eigen3/Eigen /usr/local/include/Eigen
sudo ln -s /usr/local/include/eigen3/unsupported /usr/local/include/unsupported
# 方法2:在CMake中显式指定路径
include_directories("/usr/local/include/eigen3")
```
### 5. 多版本管理
当系统存在多个Eigen版本时(如ROS自带版本与手动安装版本冲突),使用以下方法强制指定路径:
```cmake
# 在CMakeLists.txt中优先指定
set(EIGEN3_INCLUDE_DIR "/usr/local/include/eigen3")
find_package(Eigen3 REQUIRED HINTS ${EIGEN3_INCLUDE_DIR})
```
### 附加说明
- **版本兼容性**:Eigen3不同次要版本(如3.3.x与3.4.x)可能存在API差异,建议项目显式声明依赖版本。
- **ROS集成**:ROS Noetic默认使用`/opt/ros/noetic/include/eigen3`路径,与系统路径隔离以避免冲突。
§§相关问题§§
1. 如何检查当前项目使用的Eigen3具体版本?
2. 在ROS项目中如何正确覆盖系统默认的Eigen3路径?
3. Eigen库的`unsupported`模块有哪些典型应用场景?
4. 如何为Eigen3编写跨平台(Windows/Linux)的CMake配置?</think>### Eigen3库头文件路径与内容详解
#### 1. Eigen3标准安装路径
在Ubuntu系统中,Eigen3库的默认安装路径为:
```bash
/usr/include/eigen3 # APT安装的默认路径
/usr/local/include/eigen3 # 手动编译安装的默认路径
```
您提到的`/usr/local/include/eigen3/Eigen/`是Eigen核心头文件的存放位置,包含所有基础线性代数功能[^1][^2]。
#### 2. Eigen核心头文件目录结构
`/usr/local/include/eigen3/Eigen/`包含以下关键头文件:
```bash
Eigen/
├── Core # 核心矩阵/向量操作 (Matrix, Vector, Array等)
├── Dense # 所有稠密矩阵功能(包含Core, Geometry, LU等)
├── Sparse # 稀疏矩阵支持
├── Geometry # 旋转/平移/缩放等几何变换
├── LU # 矩阵分解(PartialPivLU, FullPivLU)
├── Cholesky # LLT和LDLT分解
├── QR # HouseholderQR, ColPivHouseholderQR
├── SVD # JacobiSVD, BDCSVD
└── Eigenvalues # 特征值分解
```
#### 3. unsupported目录内容
`/usr/local/include/eigen3/unsupported/`包含实验性功能和扩展模块:
```bash
unsupported/
├── Eigen/
│ ├── AutoDiff # 自动微分支持
│ ├── BVH # 包围体层次结构(空间划分)
│ ├── FFT # 快速傅里叶变换
│ ├── IterativeSolvers # 迭代线性求解器
│ ├── KroneckerProduct # 克罗内克积运算
│ ├── LevenbergMarquardt # Levenberg-Marquardt优化算法
│ ├── MatrixFunctions # 矩阵指数/对数等函数
│ ├── MoreVectorization # 增强的向量化指令
│ ├── NonLinearOptimization # 非线性优化
│ ├── NumericalDiff # 数值微分
│ ├── Polynomials # 多项式操作
│ ├── Skyline # Skyline矩阵存储
│ └── Splines # 样条插值
└── test/ # 实验性功能的测试用例
```
#### 4. 验证路径是否存在
使用终端命令检查:
```bash
# 检查核心头文件
ls /usr/local/include/eigen3/Eigen
# 检查unsupported模块
ls /usr/local/include/eigen3/unsupported/Eigen
# 检查当前链接路径(重要)
echo | gcc -v -x c++ -E - 2>&1 | grep eigen3
```
#### 5. 常见配置问题解决方案
当编译器报错"Eigen/Dense: No such file"时:
```bash
# 方法1:建立符号链接(推荐)[^1][^2]
sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen
sudo ln -s /usr/include/eigen3/unsupported /usr/include/unsupported
# 方法2:在CMake中显式指定路径
include_directories("/usr/include/eigen3")
```
#### 6. 多版本管理建议
如果系统存在多个Eigen版本:
```bash
# 查看所有安装路径
sudo updatedb
locate eigen3 | grep include
# 强制CMake使用特定版本
set(EIGEN3_INCLUDE_DIR "/opt/ros/noetic/include/eigen3")
```
> **关键提示**:Eigen是纯头文件库,不需要链接二进制文件,只需确保头文件路径正确即可[^4]。
补充以下函数并解释Eigen::MatrixXd FKinSpace_single(const Eigen::MatrixXd &M, const Eigen::VectorXd &Slist, const double theta) { Eigen::MatrixXd T = M; T = MatrixExp6(VecTose3(Slist * theta)) * T; return T; } Eigen::MatrixXd MatrixExp6(const Eigen::MatrixXd &se3mat) { // Extract the angular velocity vector from the transformation matrix Eigen::Matrix3d se3mat_cut = se3mat.block<3, 3>(0, 0); Eigen::Vector3d omgtheta = so3ToVec(se3mat_cut); Eigen::MatrixXd m_ret(4, 4); // If negligible rotation, m_Ret = [[Identity, angular velocty ]] // [ 0 , 1 ]] if (NearZero(omgtheta.norm())) { // Reuse previous variables that have our required size se3mat_cut = Eigen::MatrixXd::Identity(3, 3); omgtheta << se3mat(0, 3), se3mat(1, 3), se3mat(2, 3); m_ret << se3mat_cut, omgtheta, 0, 0, 0, 1; return m_ret; } // If not negligible, MR page 105 else { double theta = (AxisAng3(omgtheta))(3); Eigen::Matrix3d omgmat = se3mat.block<3, 3>(0, 0) / theta; Eigen::Matrix3d expExpand = Eigen::MatrixXd::Identity(3, 3) * theta + (1 - std::cos(theta)) * omgmat + ((theta - std::sin(theta)) * (omgmat * omgmat)); Eigen::Vector3d linear(se3mat(0, 3), se3mat(1, 3), se3mat(2, 3)); Eigen::Vector3d GThetaV = (expExpand * linear) / theta; m_ret << MatrixExp3(se3mat_cut), GThetaV, 0, 0, 0, 1; return m_ret; } }
<think>我现在需要帮助用户补充并解释他们提供的两个函数:`FKinSpace_single`和`MatrixExp6`。首先,我需要理解这两个函数的作用以及它们之间的关系。
首先看`FKinSpace_single`函数。它的参数是初始变换矩阵M、运动旋量Slist和关节角度theta。函数内部调用了`MatrixExp6`和`VecTose3`,然后将结果乘以初始矩阵M。看起来这是正运动学计算的一部分,可能用于机器人学中的空间变换。
接下来是`MatrixExp6`函数,它接受一个se(3)矩阵(6维李代数的矩阵表示),返回对应的4x4变换矩阵。se(3)矩阵分为旋转部分(so(3))和位移部分。函数首先检查旋转部分是否可忽略,如果是,则直接构造变换矩阵;否则,按照指数映射的方法计算。
用户提供的代码中有一些潜在的问题。例如,在`MatrixExp6`的NearZero分支中,代码将se3mat_cut赋值为单位矩阵,但原se3mat_cut是se3mat的前3x3块,这可能不正确。此外,在Else分支中,计算theta的方式可能有问题,因为AxisAng3函数返回的是4维向量(前三维是轴,第四维是角度),但直接取第四个元素作为theta可能不正确,因为轴角表示的theta是第四维的值,而前三维是单位向量。
另外,`VecTose3`函数的实现没有给出,但根据上下文,它应该将一个6维向量转换为se(3)矩阵。需要确保这个转换是正确的,即前三维是角速度部分,后三维是线速度部分,并且se(3)矩阵的结构符合李代数的定义。
在补充代码时,需要注意以下几点:
1. 修正`MatrixExp6`中NearZero分支的逻辑,确保正确处理位移部分。
2. 修正Else分支中theta的计算,正确从轴角表示中提取角度。
3. 确保`VecTose3`函数正确将向量转换为se(3)矩阵。
4. 检查矩阵乘法的顺序是否正确,因为变换矩阵的乘法顺序很重要。
此外,用户可能希望了解这些函数在机器人正运动学中的应用,特别是如何通过运动旋量和指数映射来计算末端执行器的位姿。需要解释se(3)和SE(3)的关系,以及运动旋量的概念。
最后,需要确保补充的代码没有语法错误,并且逻辑正确。例如,在NearZero分支中,位移部分应该直接取se3mat的后三列,而不是用omgtheta来赋值。在Else分支中,theta应该是轴角表示的第四个元素,但需要确认AxisAng3函数的返回格式是否正确。</think>### 补充后的函数实现
```cpp
#include <Eigen/Dense>
#include <cmath>
// 将6维向量转换为se(3)矩阵(运动旋量的矩阵表示)
Eigen::MatrixXd VecTose3(const Eigen::VectorXd& vec) {
Eigen::MatrixXd se3mat = Eigen::MatrixXd::Zero(4, 4);
Eigen::Vector3d omg = vec.head(3); // 角速度部分(轴角表示)
Eigen::Vector3d v = vec.tail(3); // 线速度部分
double theta = omg.norm(); // 角度
if (theta < 1e-6) {
// 若角度趋近于0,se(3)矩阵近似为:[omg_hat, v; 0, 0]
se3mat.block<3,3>(0,0) = so3ToVec(omg).asDiagonal(); // 反对称矩阵
se3mat.block<3,1>(0,3) = v;
} else {
// 通用情况:se(3)矩阵 = [omg_hat, v; 0, 0]
Eigen::Matrix3d omg_hat = so3ToVec(omg / theta); // 归一化后的轴角反对称矩阵
se3mat.block<3,3>(0,0) = omg_hat * theta; // 恢复原始角度的反对称矩阵
se3mat.block<3,1>(0,3) = v;
}
return se3mat;
}
// 计算se(3)矩阵的指数映射(SE(3)变换矩阵)
Eigen::MatrixXd MatrixExp6(const Eigen::MatrixXd& se3mat) {
Eigen::Matrix3d se3mat_rot = se3mat.block<3,3>(0,0); // 提取旋转部分的se(3)矩阵块
Eigen::Vector3d omgtheta = so3ToVec(se3mat_rot); // 转换为轴角向量([ax, ay, az, theta])
double theta = omgtheta(3); // 提取角度
Eigen::MatrixXd T = Eigen::MatrixXd::Identity(4,4);
if (theta < 1e-6) {
// 角度趋近于0时,指数映射近似为:[I, v; 0, 1]
T.block<3,3>(0,0) = Eigen::Matrix3d::Identity();
T.block<3,1>(0,3) = se3mat.block<3,1>(0,3); // 直接取se(3)的线速度部分
} else {
// 通用情况(MR教材Page 105)
Eigen::Matrix3d omg_hat = so3ToVec(omgtheta.head(3)/theta); // 归一化轴的反对称矩阵
Eigen::Matrix3d exp_rot = MatrixExp3(se3mat_rot); // 计算旋转部分的指数映射(SO(3))
// 计算G(theta)矩阵(线速度部分的缩放因子)
Eigen::Matrix3d G_theta = (Eigen::Matrix3d::Identity() * theta +
(1 - std::cos(theta)) * omg_hat +
(theta - std::sin(theta)) * omg_hat * omg_hat) / theta;
Eigen::Vector3d v = se3mat.block<3,1>(0,3);
T.block<3,1>(0,3) = G_theta * v; // 计算线速度部分
T.block<3,3>(0,0) = exp_rot; // 组合旋转部分
}
return T;
}
// 正运动学计算(空间形式)
Eigen::MatrixXd FKinSpace_single(const Eigen::MatrixXd& M, const Eigen::VectorXd& Slist, const double theta) {
Eigen::MatrixXd T = M;
Eigen::MatrixXd se3mat = VecTose3(Slist * theta); // 将运动旋量乘以角度,转换为se(3)矩阵
T = MatrixExp6(se3mat) * T; // 计算指数映射并更新变换矩阵
return T;
}
```
### 函数解释
#### 1. **`VecTose3` 函数**
- **功能**:将6维运动旋量(Spatial Velocity)转换为se(3)矩阵(李代数表示)。
- **输入**:6维向量 `[ω; v]`,其中 `ω` 是角速度(轴角表示),`v` 是线速度。
- **输出**:4×4的se(3)矩阵,结构为:
\[
\text{se}(3) =
\begin{bmatrix}
\hat{\omega} & v \\
\mathbf{0} & 0
\end{bmatrix}
\]
其中 `\hat{\omega}` 是 `ω` 的反对称矩阵(对应SO(3)的李代数so(3))。
#### 2. **`MatrixExp6` 函数**
- **功能**:计算se(3)矩阵的指数映射,得到SE(3)变换矩阵(4×4齐次矩阵)。
- **输入**:se(3)矩阵(运动旋量的李代数形式)。
- **输出**:SE(3)变换矩阵,包含旋转(SO(3))和平移。
- **关键步骤**:
- **旋转部分**:通过 `MatrixExp3` 计算so(3)矩阵的指数映射,得到SO(3)旋转矩阵。
- **线速度部分**:通过 `G(theta)` 矩阵缩放线速度 `v`,其中 `G(theta)` 是轴角 `θ` 的函数。
- **近似处理**:当角度 `θ` 趋近于0时,直接取线速度部分(避免数值不稳定)。
#### 3. **`FKinSpace_single` 函数**
- **功能**:通过运动旋量和关节角度,计算机器人末端在空间中的位姿(SE(3)变换矩阵)。
- **输入**:
- `M`:初始变换矩阵(如基坐标系到世界坐标系的转换)。
- `Slist`:运动旋量参数(6维向量,定义关节的轴线和位置)。
- `theta`:关节角度。
- **输出**:更新后的变换矩阵 `T`,表示末端执行器在世界坐标系中的位姿。
- **数学原理**:
\[
T = e^{[\mathcal{S}_i] \theta_i} \cdot M
\]
其中 `[\mathcal{S}_i]` 是第 `i` 个关节的运动旋量(se(3)矩阵),`θ_i` 是关节角度,`M` 是初始位姿。
### 示例说明
假设有一个旋转关节,运动旋量 `Slist = [0; 0; 1; 0; 0; 0]`(绕z轴旋转),关节角度 `θ = π/2`:
1. `VecTose3(Slist * θ)` 生成se(3)矩阵,旋转部分为绕z轴的反对称矩阵,线速度部分为0。
2. `MatrixExp6` 计算指数映射,得到绕z轴旋转90度的SO(3)矩阵,平移部分为0。
3. 最终 `T = e^{[\mathcal{S}]θ} \cdot M` 表示末端执行器绕z轴旋转90度后的新位姿。
### 关键点总结
- **运动旋量(Spatial Twist)**:结合角速度和线速度,描述刚体运动的瞬时速度。
- **指数映射**:将李代数(se(3))映射到李群(SE(3)),是正运动学的核心运算。
- **空间形式(Space Form)**:以基坐标系为参考,通过累积变换计算末端位姿,适用于串联机器人。
阅读全文
相关推荐
















