You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:30:25