如何在Eigen3中高效生成指定列结构的二维浮点矩阵?
更高效简洁的Eigen3实现方案
嘿,完全不用绕std::vector那一圈!Eigen本身就提供了非常直接且高效的方式来生成你需要的矩阵,既省去了中间容器的内存拷贝,代码也更简洁。
方法一:LinSpaced + replicate(最直观)
先通过LinSpaced生成单个基础列向量,再用replicate复制成多列矩阵:
#include <Eigen/Dense> int main() { const int num_samples = 5; const int num_ranges = 3; // 生成[0, 1, 2, ..., num_samples-1]的列向量 Eigen::VectorXd base_col = Eigen::VectorXd::LinSpaced(num_samples, 0, num_samples - 1); // 复制为num_ranges列的矩阵(行数保持不变,列数扩展) Eigen::MatrixXd result = base_col.replicate(1, num_ranges); // 如果需要float类型,替换为VectorXf/MatrixXf即可: // Eigen::VectorXf base_col = Eigen::VectorXf::LinSpaced(num_samples, 0.f, num_samples - 1.f); // Eigen::MatrixXf result = base_col.replicate(1, num_ranges); return 0; }
LinSpaced会直接按步长1生成连续序列(因为起始0、结束num_samples-1,共num_samples个元素,步长正好是1),replicate(1, num_ranges)表示将原向量复制1行(保持行数)、num_ranges列,完美得到每列都是相同连续序列的矩阵。
方法二:colwise赋值(灵活性更强)
如果你需要先初始化矩阵再赋值,也可以用colwise()批量给每一列赋值:
#include <Eigen/Dense> int main() { const int num_samples = 5; const int num_ranges = 3; Eigen::MatrixXd result(num_samples, num_ranges); // 给每一列都赋值为[0,1,..num_samples-1]的序列 result.colwise() = Eigen::VectorXd::LinSpaced(num_samples, 0, num_samples - 1); return 0; }
这种方式跳过了中间向量的存储,直接将序列赋值给所有列,效率和第一种方法几乎一致,代码同样简洁。
为什么比原方法更好?
- 无额外内存开销:原方法需要先创建std::vector并填充,再拷贝到Eigen矩阵,多了一次内存分配和数据拷贝;而上述Eigen原生方法直接在矩阵内存中生成数据,没有冗余操作。
- 代码更简洁:几行代码就能完成,可读性更强,不需要手动处理vector的填充和转换逻辑。
- 类型安全:直接生成Eigen矩阵类型,避免了容器转换可能带来的类型错误。
内容的提问来源于stack exchange,提问作者tangy
相关产品推荐
相关产品推荐

