
创建矩阵后要给它填值。本章讲所有初始化方法逗号初始化、Zero/Ones/Identity/Random、set 系列、resize 等。24.1 创建矩阵创建矩阵时可以指定大小Eigen::MatrixXdm(2,3);// 2 行 3 列元素是未初始化的垃圾值Eigen::VectorXdv(5);// 长度为 5 的向量Eigen::Matrix3d fixed;// 固定大小不用写参数Eigen::Vector3d v3;// 固定大小 3 维向量注意MatrixXd m(2,3)的元素是未初始化的可能是垃圾值一定要先填值再用。24.2 逗号初始化最常用用按从左到右、从上到下的顺序填值Eigen::Matrix3d m;m1,2,3,// 第一行4,5,6,// 第二行7,8,9;// 第三行向量同理Eigen::Vector3d v;v10,20,30;逗号初始化非常直观是 Eigen 的标志性语法。24.3 快捷初始化不用逐个填可以直接生成特殊矩阵Eigen::MatrixXd::Zero(2,3);// 全 0Eigen::MatrixXd::Ones(2,3);// 全 1Eigen::MatrixXd::Identity(3,3);// 单位矩阵Eigen::MatrixXd::Constant(2,3,7);// 全 7Eigen::MatrixXd::Random(2,3);// 随机数 [-1, 1)注意这些是静态方法用类型::方法()调用#includeEigen/Dense#includeiostreamintmain(){Eigen::Matrix3d zEigen::Matrix3d::Zero();// 全 0Eigen::Matrix3d oEigen::Matrix3d::Ones();// 全 1Eigen::Matrix3d idEigen::Matrix3d::Identity();// 单位矩阵Eigen::Matrix3d cEigen::Matrix3d::Constant(5);// 全 5Eigen::Matrix3d rEigen::Matrix3d::Random();// 随机std::coutZero:\nz\n\n;std::coutIdentity:\nid\n\n;std::coutRandom:\nr\n;return0;}实际输出Random那一段每次运行都不一样Zero: 0 0 0 0 0 0 0 0 0 Identity: 1 0 0 0 1 0 0 0 1 Random: -0.934479 0.676625 -0.554193 -0.275777 -0.0601981 0.471348 0.768346 -0.607514 0.125891Random()生成的数落在[-1, 1)之间不是 0 到 1也不是大整数。这是第 35 章坑 1要专门讲的事先留个印象。24.4 set 系列给已有矩阵重新赋值已创建的矩阵用set系列重新填Eigen::MatrixXdm(3,3);m.setZero();// 全 0m.setOnes();// 全 1m.setIdentity();// 单位矩阵m.setConstant(5);// 全 5m.setRandom();// 随机setXXX()是修改已有的矩阵XXX()如MatrixXd::Zero()是创建新的。两者对应。24.5 等间距序列 LinSpaced生成等差数列Eigen::VectorXd vEigen::VectorXd::LinSpaced(5,0,1);// 5 个数从 0 到 1含两端0, 0.25, 0.5, 0.75, 1LinSpaced(size, low, high)生成 size 个从 low 到 high 的等间距数。24.6 resize改变动态矩阵的大小动态矩阵可以随时改变大小Eigen::MatrixXd m;m.resize(2,3);// 变成 2x3m.setZero();m.resize(4,2);// 再变成 4x2注意只有动态矩阵MatrixXd、VectorXd能 resize。固定大小矩阵Matrix3d不能 resize。resize 会保留原有数据新增加的元素未初始化要小心。24.7 用一个矩阵初始化另一个Eigen::Matrix3d aEigen::Matrix3d::Identity();Eigen::Matrix3d ba;// 复制Eigen::Matrix3dc(a);// 拷贝构造Eigen::MatrixXd da;// 不同大小也能转换数据要能装下24.8 完整示例#includeEigen/Dense#includeiostreamintmain(){// 1. 逗号初始化Eigen::Matrix3d m;m1,2,3,4,5,6,7,8,9;// 2. 快捷初始化Eigen::Matrix3d IEigen::Matrix3d::Identity();// 3. 等间距Eigen::VectorXd seqEigen::VectorXd::LinSpaced(10,0,1);// 4. resizeEigen::MatrixXd dyn;dyn.resize(2,4);dyn.setZero();std::coutm \nm\n\n;std::coutI \nI\n\n;std::coutseq seq.transpose()\n\n;std::coutdyn \ndyn\n;return0;}存成ch24.cpp按附录 C.3 编译运行实际输出m 1 2 3 4 5 6 7 8 9 I 1 0 0 0 1 0 0 0 1 seq 0 0.111111 0.222222 0.333333 0.444444 0.555556 0.666667 0.777778 0.888889 1 dyn 0 0 0 0 0 0 0 0seq是 10 个从 0 到 1 的等间距数间距 1 / (10-1) 0.1111——记住这个含两端所以除以 n-1的细节很多人在这儿算错。24.9 小结逗号初始化按行填值。Zero/Ones/Identity/Constant/Random生成特殊矩阵。setXXX()给已有矩阵重新赋值。LinSpaced生成等差数列。resize改变动态矩阵大小固定矩阵不能。下一章学习索引与块操作——读写矩阵里的元素和子矩阵。练习题用逗号初始化创建一个 3×3 矩阵填入 1~9。分别创建 Zero、Identity、Random 矩阵并打印。用setConstant(7)把一个矩阵全填成 7。用LinSpaced生成 0 到 10 的 11 个数。试试给固定大小的Matrix3d调用 resize看报什么错。