C++之 Eigen-3.4.0 全方位教程:Chapter04-操作篇

这篇博客详细介绍了Eigen库中矩阵块操作的使用,包括动态和静态大小的块表达式,以及左值和右值操作。内容涵盖块的读写、单独行和列的访问、角块操作、向量的块操作、切片和索引等。通过示例代码展示了如何高效地操作矩阵的特定部分,并解释了不同操作对性能的影响。

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

块操作

块操作既可以作为右值,还可以作为左值!

基本操作

Block operation dynamic-size block expression fixed-size block expression
Block of size (p,q), starting at (i,j) matrix.block(i,j,p,q); matrix.block<p,q>(i,j);

两个版本都可用于固定大小和动态大小的矩阵和数组。这两个表达式在语义上是等价的。

唯一的区别是,如果块大小很小,固定大小的版本通常会给你更快的代码,但需要在编译时知道这个大小。

void Eigen_Introduction_Block()
{
   
   
	Eigen::MatrixXf m(4, 4);
	m << 1, 2, 3, 4,
		 5, 6, 7, 8,
		 9, 10, 11, 12,
		 13, 14, 15, 16;
	cout << "Block in the middle" << endl;
	cout << m.block<2, 2>(1, 1) << endl << endl;
	for (int i = 1; i <= 3; ++i)
	{
   
   
		cout << "Block of size " << i << "x" << i << endl;
		cout << m.block(0, 0, i, i) << endl << endl;
	}
}

输出:

Block in the middle
 6  7
10 11

Block of size 1x1
1

Block of size 2x2
1 2
5 6

Block of size 3x3
 1  2  3
 5  6  7
 9 10 11

块的左值操作

void Eigen_Introduction_Block001()
{
   
   
	Array22f m;
	m << 1, 2,
		 3, 4;
	Array44f a = Array44f::Constant(0.6);
	cout << "Here is the array a:" << endl << a << endl << endl;
	a.block<2, 2>(1, 1) = m;
	cout << "Here is now a with m copied into its central 2x2 block:" << endl << a << endl << endl;
	a.block(0, 0, 2, 3) = a.block(2, 1, 2, 3);
	cout << "Here is now a with bottom-right 2x3 block copied into top-left 2x3 block:" << endl << a << endl << endl;
}

输出

Here is the array a:
0.6 0.6 0.6 0.6
0.6 0.6 0.6 0.6
0.6 0.6 0.6 0.6
0.6 0.6 0.6 0.6

Here is now a with m copied into its central 2x2 block:
0.6 0.6 0.6 0.6
0.6   1   2 0.6
0.6   3   4 0.6
0.6 0.6 0.6 0.6

Here is now a with bottom-right 2x3 block copied into top-left 2x3 block:
  3   4 0.6 0.6
0.6 0.6 0.6 0.6
0.6   3   4 0.6
0.6 0.6 0.6 0.6

列和行

单独的行和列是块的特殊情况,Eigen提供了对应的函数。

matrix.row(i);matrix.col(j);

void Eigen_Introduc
<think>好的,我现在需要解决用户在使用Eigen库时遇到的包含路径错误的问题。用户提到的错误是“Dense头文件报错”,具体路径是“D:/eigen-3.4.0/eigen-3.4.0/Eigen/Dense”。我需要结合用户提供的引用内容来找出解决方案。 首先,根据引用[3],安装Eigen库有两种方法:通过apt安装或者从官网下载源码。用户显然是从官网下载的,因为路径是D盘下的解压目录。引用[3]中提到,如果使用官网下载的源码,需要在项目的包含目录中添加Eigen的路径。例如在VS Studio中,右键项目属性,在VC++目录的包含目录里添加路径。用户可能没有正确设置这个路径,导致编译器找不到头文件。 然后看引用[1]和[2],其中提到需要将Eigen的路径包含到CMakeLists.txt中。比如,引用[2]中的CMakeLists.txt有include_directories("/home/joanna/Downloads/eigen-3.4.0"),这应该是用户项目中的Eigen路径。用户当前的路径是D:/eigen-3.4.0/eigen-3.4.0,可能需要检查CMakeLists中的路径是否正确,是否指向正确的Eigen父目录。 另外,引用[3]还提到可能需要将Eigen目录复制到系统的包含路径,比如/usr/local/include,但用户使用的是Windows系统(路径是D盘),所以可能需要不同的处理方式。在Windows下,通常是在IDE中设置包含路径,或者确保CMake正确配置。 用户可能在CMakeLists.txt中没有正确设置include_directories,或者路径写错了。例如,正确的路径应该是D:/eigen-3.4.0,而不是包含到Eigen子目录,因为Eigen的头文件位于解压后的目录中的Eigen文件夹。所以,如果include_directories指向的是D:/eigen-3.4.0,那么#include <Eigen/Dense>就能正确找到,因为Eigen目录在D:/eigen-3.4.0下。 另外,用户可能在代码中使用了错误的包含方式。例如,正确的方式是#include <Eigen/Dense>,但用户可能路径配置错误,导致编译器找不到这个路径。 还需要检查路径中的斜杠是否正确,Windows中使用反斜杠,但在CMake中可能需要用正斜杠或双反斜杠。例如,D:/eigen-3.4.0应该正确。 另外,引用[1]提到需要将Eigen的核心和Tensor部分复制到项目目录,但用户可能没有这样做,或者复制的位置不对。不过更常见的做法是直接在CMake中包含Eigen的根目录,而不需要复制文件到项目里。 可能的解决方案步骤: 1. 确认Eigen库的解压路径是否正确,路径是否存在。 2. 在CMakeLists.txt中使用include_directories命令添加Eigen的根目录,例如D:/eigen-3.4.03. 确保代码中的包含语句是#include <Eigen/Dense>。 4. 如果是使用Visual Studio,检查项目属性中的包含目录是否添加了Eigen的路径。 5. 重新生成CMake项目,并清理可能的缓存。 用户可能的问题在于CMakeLists.txt中的路径设置不正确,或者IDE的包含路径没有正确配置。需要指导用户检查这些配置,并确保路径正确无误。</think>### 解决Eigen库包含路径错误的步骤 #### 1. 确认Eigen库的安装路径 确保解压后的Eigen库路径为 `D:/eigen-3.4.0`,目录结构应包含 `Eigen` 子文件夹(如 `D:/eigen-3.4.0/Eigen`)。若解压后路径为 `D:/eigen-3.4.0/eigen-3.4.0`,需调整后续配置中的路径。 #### 2. 配置CMakeLists.txt 在项目的 `CMakeLists.txt` 中添加Eigen库的包含路径: ```cmake include_directories("D:/eigen-3.4.0") # 指向Eigen根目录,而非子文件夹 ``` 注意路径中无需包含 `Eigen` 子目录,因为头文件引用格式为 `#include <Eigen/Dense>`[^2][^3]。 #### 3. 验证Visual Studio配置(如适用) 如果使用Visual Studio: 1. 右键项目 → 属性 → **VC++目录** → **包含目录** → 添加路径 `D:/eigen-3.4.0`。 2. 清理项目并重新生成解决方案[^3]。 #### 4. 检查代码包含语句 确保代码中头文件引用格式正确: ```cpp #include <Eigen/Dense> // 正确格式 ``` 而非: ```cpp #include "D:/eigen-3.4.0/Eigen/Dense" // 错误格式 ``` #### 5. 重启开发环境 修改配置后,重启IDE或执行 `File → Reload CMake Project`(如CLion)以刷新路径缓存[^1]。 #### 6. 测试代码 使用简单代码验证安装: ```cpp #include <iostream> #include <Eigen/Dense> int main() { Eigen::MatrixXd m = Eigen::MatrixXd::Random(3,3); std::cout << m << std::endl; return 0; } ``` 若输出随机矩阵,则配置成功[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacob-xyb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值