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

C++使用newmat矩阵时vector无调用运算符及push_back匹配错误求解

问题排查与解决方案

错误原因分析

1. Type 'vector' does not provide a call operator 报错

C++中std::vector的元素访问运算符为方括号[],代码中使用temp(i)的写法会被编译器识别为调用temp对象的operator()调用运算符,但std::vector并没有实现该运算符,因此触发报错。

2. No matching member function for call to 'push_back' 报错

该报错由两个类型不匹配问题叠加导致:

  • 定义的二维向量B类型为vector<vector<double>>,push_back方法要求传入的参数必须是vector<double>类型,但代码中传入的是temp(i)单个元素值,类型不匹配
  • 定义的temp为vector<int>类型,和B要求的元素类型vector<double>也存在类型不匹配

除此之外代码还存在两处隐藏问题:

  • temp未初始化容量就直接通过索引赋值,会触发数组越界
  • 第一层循环中每次迭代都会覆盖temp的内容,最终temp只会保留最后一列的数值,后续筛选逻辑无法拿到历史列的内容

修复步骤

  • 所有temp的元素访问语法统一从圆括号()改为方括号[]
  • 将temp的类型改为vector<double>,同时初始化容量匹配需要存储的元素数量
  • 调整循环逻辑,每读取完一列就判断是否要存入B,避免temp内容被覆盖

修正后代码示例

#include <vector>
// 已正确引入newmat相关头文件
using namespace std;

// 矩阵A、rank_of_A、did_i_pick_this_col已提前正确定义
vector<vector<double>> B;
int col_num = A.ncols();
for (int i = 1; i <= col_num; ++i) { // 遍历矩阵每一列
    vector<double> temp(rank_of_A); // 每次循环新建temp存储当前列元素
    for (int j = 1; j < rank_of_A; ++j) {
        // vector为0-based索引,newmat矩阵为1-based索引,注意下标偏移
        // 如果需要按行存储可修改为temp[j-1] = A(i,j),根据实际需求调整索引即可
        temp[j-1] = A(j, i); 
    }
    // 如果did_i_pick_this_col是0-based数组注意下标偏移
    if (did_i_pick_this_col[i-1]) {
        B.push_back(temp); // 传入整列temp向量
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:36:03