如何用n*(n+1)/2维数组填充C++ Boost库创建的n阶对称矩阵
用Boost库实现对称矩阵填充的两种方案
嘿,这个需求其实很好解决,核心就是把一维数组的元素和对称矩阵的上/下三角位置建立一一映射,然后完成填充。我给你准备了两种实用方案,你可以根据自己的场景选择:
方案1:使用普通Boost Matrix手动填充对称部分
如果你习惯用普通的二维矩阵,完全可以手动遍历上三角(或下三角),填充后同时赋值给对称位置,这样就能得到对称矩阵。
代码示例
#include <boost/numeric/ublas/matrix.hpp> #include <vector> #include <iostream> using namespace boost::numeric::ublas; int main() { int n = 3; // 替换成你需要的矩阵大小 std::vector<double> filler(n*(n+1)/2); // 先初始化filler数组(这里用示例值,你可以替换成自己的随机值或自定义数据) for (int k = 0; k < filler.size(); ++k) { filler[k] = k + 1.0; } // 创建n×n的空矩阵 matrix<double> sym_mat(n, n); // 填充上三角并同步到下三角 int arr_idx = 0; for (int i = 0; i < n; ++i) { // 从对角线j=i开始遍历到行尾,覆盖上三角区域 for (int j = i; j < n; ++j) { sym_mat(i, j) = filler[arr_idx]; // 非对角线位置,同步赋值给对称的下三角位置 if (i != j) { sym_mat(j, i) = filler[arr_idx]; } arr_idx++; } } // 打印验证矩阵 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { std::cout << sym_mat(i, j) << " "; } std::cout << "\n"; } return 0; }
关键说明
- 这里用
arr_idx作为一维数组的索引,按行优先遍历上三角(从对角线开始向右),天然对应数组的顺序,不需要复杂的索引计算公式,直观又不容易出错。 - 如果想填充下三角,只需要把内层循环改成
for (int j = 0; j <= i; ++j),然后同步赋值给sym_mat(j, i)即可。
方案2:使用Boost Symmetric Matrix(更高效)
Boost专门提供了symmetric_matrix容器,它内部只存储上三角或下三角的元素,访问对称位置时会自动返回对应的值,既节省内存,又不需要手动处理对称赋值,适合大型矩阵场景。
代码示例
#include <boost/numeric/ublas/symmetric.hpp> #include <vector> #include <iostream> using namespace boost::numeric::ublas; int main() { int n = 3; std::vector<double> filler(n*(n+1)/2); // 初始化filler数组 for (int k = 0; k < filler.size(); ++k) { filler[k] = k + 1.0; } // 创建上三角对称矩阵(第二个参数`upper`表示存储上三角,`lower`则对应下三角) symmetric_matrix<double, upper> sym_mat(n); int arr_idx = 0; // 只需要填充上三角区域,容器会自动处理对称访问 for (int i = 0; i < n; ++i) { for (int j = i; j < n; ++j) { sym_mat(i, j) = filler[arr_idx]; arr_idx++; } } // 打印验证:访问下三角位置时会自动返回对称值 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { std::cout << sym_mat(i, j) << " "; } std::cout << "\n"; } return 0; }
关键说明
symmetric_matrix的模板参数upper/lower指定了存储的三角区域,你只需要填充对应的区域即可,无需手动处理对称赋值。- 访问矩阵的任意位置(包括对称区域)时,容器会自动返回正确的值,使用体验和普通矩阵完全一致,但内存占用只有普通矩阵的一半左右。
内容的提问来源于stack exchange,提问作者Thanos
相关产品推荐
相关产品推荐

