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
相关产品推荐
相关产品推荐

