Eigen sparse 基本操作:构造 & 输出

本文展示了一个使用Eigen库创建和操作稀疏矩阵的C++示例。通过向稀疏矩阵中添加元素并处理重复索引的情况,演示了如何利用Eigen::Triplet进行矩阵填充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include "Eigen/Sparse"
int main()
{
	Eigen::SparseMatrix<float> m(3, 3);
	std::vector<Eigen::Triplet<float> > triple;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			triple.push_back(Eigen::Triplet<float>(i, j, 0.1));
		}
	}
	triple.push_back(Eigen::Triplet<float>(1, 1, 0.1));////相同下标重复插入,则表示相加
	m.setFromTriplets(triple.begin(), triple.end());
	//std::cout << m << std::endl; //直接这样输出也是可以的
	for (int k = 0; k < m.outerSize(); ++k) {
		for (Eigen::SparseMatrix<float>::InnerIterator it(m, k); it; ++it)
		{
			//std::cout << it.row() << " " << it.col() << " : " << it.value() << std::endl;
			std::cout << it.value() << " ";
		}
		std::cout << std::endl;
	}
	return 0;
}

报错:guo@guo-Dell-G15-5520:~/g2o仿真/src/build$ make Consolidate compiler generated dependencies of target g2o_demo [ 50%] Building CXX object CMakeFiles/g2o_demo.dir/optimize.cc.o /home/guo/g2o仿真/src/optimize.cc: In function &lsquo;std::vector&lt;g2o::SE3Quat&gt; addNoise(const std::vector&lt;g2o::SE3Quat&gt;&amp;, double, double, bool)&rsquo;: /home/guo/g2o仿真/src/optimize.cc:90:61: error: no match for &lsquo;operator*&rsquo; (operand types are &lsquo;g2o::SE3Quat&rsquo; and &lsquo;const Quaternion&rsquo; {aka &lsquo;const Eigen::Quaternion&lt;double&gt;&rsquo;}) 90 | noisy[i].setRotation(g2o::SE3Quat::exp(rotNoiseVec) * noisy[i].rotation()); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~ | | | | g2o::SE3Quat const Quaternion {aka const Eigen::Quaternion&lt;double&gt;} In file included from /home/guo/g2o仿真/src/optimize.cc:11: /opt/ros/noetic/include/g2o/types/slam3d/se3quat.h:99:22: note: candidate: &lsquo;g2o::SE3Quat g2o::SE3Quat::operatonst Eigen::MatrixBase&lt;U&gt;&amp;)&rsquo; 325 | operator*(const TranspositionsBase&lt;TranspositionsDerived&gt; &amp;transpositions, | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/Core/Transpositions.h:325:1: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:90:81: note: &lsquo;g2o::SE3Quat&rsquo; is not derived from &lsquo;const Eigen::TranspositionsBase&lt;TranspositionsDerived&gt;&rsquo; 90 | noisy[i].setRotation(g2o::SE3Quat::exp(rotNoiseVec) * noisy[i].rotation()); | ^ In file included from /usr/local/include/eigen3/Eigen/Householder:24, from /usr/local/include/eigen3/Eigen/QR:15, from /usr/local/include/eigen3/Eigen/SVD:11, from /usr/local/include/eigen3/Eigen/Geometry:13, from /home/guo/g2o仿真/src/optimize.cc:5: /usr/local/include/eigen3/Eigen/src/Householder/HouseholderSequence.h:513:99: note: candidate: &lsquo;template&lt;class OtherDerived, class VectorsType, class CoeffsType, int Side&gt; typename Eigen::internal::matrix_type_times_scalar_type&lt;typename VectorsType::Scalar, OtherDerived&gt;::Type Eigen::operator*(const Eigen::MatrixBase&lt;Derived&gt;&amp;, const Eigen::HouseholderSequence&lt;VectorsType, CoeffsType, Side&gt;&amp;)&rsquo; 513 | typename internal::matrix_type_times_scalar_type&lt;typename VectorsType::Scalar,OtherDerived&gt;::Type operator*(const MatrixBase&lt;OtherDerived&gt;&amp; other, const HouseholderSequence&lt;VectorsType,CoeffsType,Side&gt;&amp; h) | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/Householder/HouseholderSequence.h:513:99: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:90:81: note: &lsquo;g2o::SE3Quat&rsquo; is not derived from &lsquo;const Eigen::MatrixBase&lt;Derived&gt;&rsquo; 90 | noisy[i].setRotation(g2o::SE3Quat::exp(rotNoiseVec) * noisy[i].rotation()); | ^ In file included from /usr/local/include/eigen3/Eigen/Geometry:46, from /home/guo/g2o仿真/src/optimize.cc:5: /usr/local/include/eigen3/Eigen/src/Geometry/Scaling.h:135:1: note: candidate: &lsquo;template&lt;class Derived, class Scalar&gt; Eigen::CwiseBinaryOp&lt;Eigen::internal::scalar_product_op&lt;typename Eigen::internal::traits&lt;T&gt;::Scalar, Scalar&gt;, const Derived, const typename Eigen::internal::plain_constant_type&lt;Expr, Scalar&gt;::type&gt; Eigen::operator*(const Eigen::MatrixBase&lt;Derived&gt;&amp;, const Eigen::UniformScaling&lt;Scalar&gt;&amp;)&rsquo; 135 | operator*(const MatrixBase&lt;Derived&gt;&amp; matrix, const UniformScaling&lt;Scalar&gt;&amp; s) | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/Geometry/Scaling.h:135:1: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:90:81: note: &lsquo;g2o::SE3Quat&rsquo; is not derived from &lsquo;const Eigen::MatrixBase&lt;Derived&gt;&rsquo; 90 | noisy[i].setRotation(g2o::SE3Quat::exp(rotNoiseVec) * noisy[i].rotation()); | ^ In file included from /usr/local/include/eigen3/Eigen/SparseCore:62, from /usr/local/include/eigen3/Eigen/Sparse:26, from /opt/ros/noetic/include/g2o/solvers/eigen/linear_solver_eigen.h:30, from /home/guo/g2o仿真/src/optimize.cc:10: /usr/local/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h:147:1: note: candidate: &lsquo;template&lt;class SparseDerived, class PermDerived&gt; const Eigen::Product&lt;MatrixDerived, PermutationDerived, 2&gt; Eigen::operator*(const Eigen::SparseMatrixBase&lt;OtherDerived&gt;&amp;, const Eigen::PermutationBase&lt;PermutationDerived&gt;&amp;)&rsquo; 147 | operator*(const SparseMatrixBase&lt;SparseDerived&gt;&amp; matrix, const PermutationBase&lt;PermDerived&gt;&amp; perm) | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h:147:1: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:90:81: note: &lsquo;g2o::SE3Quat&rsquo; is not derived from &lsquo;const Eigen::SparseMatrixBase&lt;OtherDerived&gt;&rsquo; 90 | noisy[i].setRotation(g2o::SE3Quat::exp(rotNoiseVec) * noisy[i].rotation()); | ^ In file included from /usr/local/include/eigen3/Eigen/SparseCore:62, from /usr/local/include/eigen3/Eigen/Sparse:26, from /opt/ros/noetic/include/g2o/solvers/eigen/linear_solver_eigen.h:30, from /home/guo/g2o仿真/src/optimize.cc:10: /usr/local/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h:154:1: note: candidate: &lsquo;template&lt;class SparseDerived, class PermDerived&gt; const Eigen::Product&lt;PermDerived, SparseDerived, 2&gt; Eigen::operator*(const Eigen::PermutationBase&lt;PermutationDerived&gt;&amp;, const Eigen::SparseMatrixBase&lt;OtherDerived&gt;&amp;)&rsquo; 154 | operator*( const PermutationBase&lt;PermDerived&gt;&amp; perm, const SparseMatrixBase&lt;SparseDerived&gt;&amp; matrix) | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h:154:1: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:90:81: note: &lsquo;g2o::SE3Quat&rsquo; is not derived from &lsquo;const Eigen::PermutationBase&lt;PermutationDerived&gt;&rsquo; 90 | noisy[i].setRotation(g2o::SE3Quat::exp(rotNoiseVec) * noisy[i].rotation()); | ^ In file included from /usr/local/include/eigen3/Eigen/SparseCore:62, from /usr/local/include/eigen3/Eigen/Sparse:26, from /opt/ros/noetic/include/g2o/solvers/eigen/linear_solver_eigen.h:30, from /home/guo/g2o仿真/src/optimize.cc:10: /usr/local/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h:162:1: note: candidate: &lsquo;template&lt;class SparseDerived, class PermutationType&gt; const Eigen::Product&lt;SparseDerived, Eigen::Inverse&lt;Rhs&gt;, 2&gt; Eigen::operator*(const Eigen::SparseMatrixBase&lt;OtherDerived&gt;&amp;, const Eigen::InverseImpl&lt;PermutationType, Eigen::PermutationStorage&gt;&amp;)&rsquo; 162 | operator*(const SparseMatrixBase&lt;SparseDerived&gt;&amp; matrix, const InverseImpl&lt;PermutationType, PermutationStorage&gt;&amp; tperm) | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h:162:1: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:90:81: note: &lsquo;g2o::SE3Quat&rsquo; is not derived from &lsquo;const Eigen::SparseMatrixBase&lt;OtherDerived&gt;&rsquo; 90 | noisy[i].setRotation(g2o::SE3Quat::exp(rotNoiseVec) * noisy[i].rotation()); | ^ In file included from /usr/local/include/eigen3/Eigen/SparseCore:62, from /usr/local/include/eigen3/Eigen/Sparse:26, from /opt/ros/noetic/include/g2o/solvers/eigen/linear_solver_eigen.h:30, from /home/guo/g2o仿真/src/optimize.cc:10: /usr/local/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h:171:1: note: candidate: &lsquo;template&lt;class SparseDerived, class PermutationType&gt; const Eigen::Product&lt;Eigen::Inverse&lt;Rhs&gt;, SparseDerived, 2&gt; Eigen::operator*(const Eigen::InverseImpl&lt;PermutationType, Eigen::PermutationStorage&gt;&amp;, const Eigen::SparseMatrixBase&lt;OtherDerived&gt;&amp;)&rsquo; 171 | operator*(const InverseImpl&lt;PermutationType,PermutationStorage&gt;&amp; tperm, const SparseMatrixBase&lt;SparseDerived&gt;&amp; matrix) | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/SparseCore/SparsePermutation.h:171:1: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:90:81: note: &lsquo;g2o::SE3Quat&rsquo; is not derived from &lsquo;const Eigen::InverseImpl&lt;PermutationType, Eigen::PermutationStorage&gt;&rsquo; 90 | noisy[i].setRotation(g2o::SE3Quat::exp(rotNoiseVec) * noisy[i].rotation()); | ^ In file included from /usr/local/include/eigen3/Eigen/Geometry:40, from /home/guo/g2o仿真/src/optimize.cc:5: /usr/local/include/eigen3/Eigen/src/Geometry/RotationBase.h:80:66: note: candidate: &lsquo;Eigen::Transform&lt;double, 3, 2&gt; Eigen::operator*(const Eigen::DiagonalMatrix&lt;double, 3&gt;&amp;, const Eigen::Quaternion&lt;double&gt;&amp;)&rsquo; 80 | EIGEN_DEVICE_FUNC friend inline Transform&lt;Scalar,Dim,Affine&gt; operator*(const DiagonalMatrix&lt;Scalar,Dim&gt;&amp; l, const Derived&amp; r) | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/Geometry/RotationBase.h:80:110: note: no known conversion for argument 1 from &lsquo;g2o::SE3Quat&rsquo; to &lsquo;const Eigen::DiagonalMatrix&lt;double, 3&gt;&amp;&rsquo; 80 | EIGEN_DEVICE_FUNC friend inline Transform&lt;Scalar,Dim,Affine&gt; operator*(const DiagonalMatrix&lt;Scalar,Dim&gt;&amp; l, const Derived&amp; r) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ /usr/local/include/eigen3/Eigen/src/Geometry/RotationBase.h:76:49: note: candidate: &lsquo;template&lt;class OtherDerived&gt; Eigen::RotationBase&lt;Eigen::Quaternion&lt;double&gt;, 3&gt;::RotationMatrixType Eigen::operator*(const Eigen::EigenBase&lt;Derived&gt;&amp;, const Eigen::Quaternion&lt;double&gt;&amp;)&rsquo; 76 | EIGEN_DEVICE_FUNC inline RotationMatrixType operator*(const EigenBase&lt;OtherDerived&gt;&amp; l, const Derived&amp; r) | ^~~~~~~~ /usr/local/include/eigen3/Eigen/src/Geometry/RotationBase.h:76:49: note: template argument deduction/substitution failed: /home/guo/g2o仿真/src/optimize.cc:90:81: note: &lsquo;g2o::SE3Quat&rsquo; is not derived from &lsquo;const Eigen::EigenBase&lt;Derived&gt;&rsquo; 90 | noisy[i].setRotation(g2o::SE3Quat::exp(rotNoiseVec) * noisy[i].rotation()); | ^ In file included from /usr/include/x86_64-linux-gnu/c++/9/bits/c++allocator.h:33, from /usr/include/c++/9/bits/allocator.h:46, from /usr/include/c++/9/string:41, from /usr/include/c++/9/bits/locale_classes.h:40, from /usr/include/c++/9/bits/ios_base.h:41, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from /home/guo/g2o仿真/src/optimize.cc:1: /usr/include/c++/9/ext/new_allocator.h: In instantiation of &lsquo;void __gnu_cxx::new_allocator&lt;_Tp&gt;::construct(_Up*, _Args&amp;&amp; ...) [with _Up = g2o::SE3Quat; _Args = {Eigen::AngleAxis&lt;double&gt;&amp;, Eigen::Matrix&lt;double, 3, 1, 0, 3, 1&gt;&amp;}; _Tp = g2o::SE3Quat]&rsquo;: /usr/include/c++/9/bits/alloc_traits.h:483:4: required from &lsquo;static void std::allocator_traits&lt;std::allocator&lt;_CharT&gt; &gt;::construct(std::allocator_traits&lt;std::allocator&lt;_CharT&gt; &gt;::allocator_type&amp;, _Up*, _Args&amp;&amp; ...) [with _Up = g2o::SE3Quat; _Args = {Eigen::AngleAxis&lt;double&gt;&amp;, Eigen::Matrix&lt;double, 3, 1, 0, 3, 1&gt;&amp;}; _Tp = g2o::SE3Quat; std::allocator_traits&lt;std::allocator&lt;_CharT&gt; &gt;::allocator_type = std::allocator&lt;g2o::SE3Quat&gt;]&rsquo; /usr/include/c++/9/bits/vector.tcc:115:30: required from &lsquo;void std::vector&lt;_Tp, _Alloc&gt;::emplace_back(_Args&amp;&amp; ...) [with _Args = {Eigen::AngleAxis&lt;double&gt;&amp;, Eigen::Matrix&lt;double, 3, 1, 0, 3, 1&gt;&amp;}; _Tp = g2o::SE3Quat; _Alloc = std::allocator&lt;g2o::SE3Quat&gt;]&rsquo; /home/guo/g2o仿真/src/optimize.cc:66:54: required from here /usr/include/c++/9/ext/new_allocator.h:146:4: error: no matching function for call to &lsquo;g2o::SE3Quat::SE3Quat(Eigen::AngleAxis&lt;double&gt;&amp;, Eigen::Matrix&lt;double, 3, 1&gt;&amp;)&rsquo; 146 | { ::new((void *)__p) _Up(std::forward&lt;_Args&gt;(__args)...); } | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最新发布
08-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值