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

C++重载[]运算符访问数组片段 实现块矩阵子矩阵提取问题

问题排查
  • 不必要的继承:subBlockMatrix不需要继承std::vector<matrix4>,多余的继承逻辑不仅没有实际作用,还会引入未初始化父类的冗余问题。
  • 映射数组使用位置错误:你定义的mapping是用来映射单个4x4矩阵内部的元素下标到3x3子矩阵的,不应该放在subBlockMatrix的下标运算符中使用,否则会把块的下标当成元素下标做映射,直接导致数组越界(你的测试中块数组只有5个元素,映射后下标会达到10,远超数组长度)。
  • 返回值类型错误:subBlockMatrix的下标运算符当前返回的是matrix4&,无法直接适配需要取9个元素的sum_of_elements,返回的完整4x4矩阵不会自动做3x3元素过滤。
  • 语法错误:main函数中sum_of_elements(subBlock[i]))多了一个多余的右括号。

可行实现方案

只需要调整subBlockMatrix的实现逻辑,让它作为块数组的视图类,调用下标运算符时直接返回对应块的3x3子矩阵视图即可:

// 不需要继承std::vector
struct subBlockMatrix
{
    std::vector<matrix4>& blockMatrix_;

    // 接收块索引,返回对应块的3x3子矩阵视图
    subMat operator[](std::size_t index) const
    {
        return subMat(blockMatrix_[index]);
    } 
    subBlockMatrix(std::vector<matrix4>& A) : blockMatrix_(A) {}
};

如果后续需要修改子矩阵的元素,可以给subMat补充非const版本的下标运算符:

double& operator[](size_t index)
{
    static size_t mapping[] = {0, 1, 2, 4, 5, 6, 8, 9, 10};
    return matrix_[mapping[index]];
}

修改后第二个循环的输出会和第一个循环完全一致,符合预期。


内容的提问来源于stack exchange,提问作者user8458838

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:45:05