【C++】删除矩阵中的指定列(非常实用)

简介: 【C++】删除矩阵中的指定列(非常实用)

注:Opencv 的 Mat 类中没有对矩阵的某一列进行单独处理的成员函数,下面使用两个函数对矩阵的某一列或多列进行删除操作;


(1)删除矩阵中的指定列——删除某一列


/*******************删除矩阵中指定的列************************/
void delete_col(Mat& arr, int num)
{
  if (num < 0 || num >= arr.cols)
  {
    cout << " 所删除的列索引不合法! " << endl;
  }
  else
  {
    //删除列是矩阵的最后一列
    if (num == arr.cols - 1)
    {
      arr = arr.t();       //求逆矩阵
      arr.pop_back();      //弹出最后一行元素
      arr = arr.t();
    }
      //num 列之后的所有数据前移一列
    for (int i = num + 1; i < arr.cols; i++)
    {
      arr.col(i - 1) = arr.col(i) + Scalar(0, 0, 0, 0);
    }
    arr = arr.t();    
    arr.pop_back();   
    arr = arr.t();
  }
}

注:该函数在删除当前列时,当前列之后的所有列都会前移一列,如果利用循环+该函数进行删除指定的多列,会出现 BUG;


(2)删除矩阵中指定列——删除多列


/*******************删除矩阵中多个指定列************************/
/*object 需要进行操作的矩阵
 *arrs   删除不合格特征点后的矩阵
 *nums   需要删除的列索引 */
void delete_nums_cols(Mat& object, Mat& arrs, vector<int>& nums, int n)
{
  arrs.create(2, n, CV_32FC1);
  //获取矩阵每一行的首地址
  float* p10 = arrs.ptr<float>(0), * p11 = arrs.ptr<float>(1);
  float* p20 = object.ptr<float>(0), * p21 = object.ptr<float>(1);
  for (int i = 0; i < object.cols; i++)
  {
    auto it = nums.begin();
    for (; it != nums.end(); it++)
    {
      //if ((*it) < 0 || (*it) >= object.cols)
      //{
      //  cout << " 所删除的列索引不合法! " << endl;
      //  continue;
      //}
      if (*it == i)
        continue;
      p10[i] = p20[i];
      p11[i] = p21[i];
    }
  }
}

注:形参  nums 中存放的列索引是经过升序排序的,且没有考虑列索引重复的情况,如果读者有需要可自行添加;

相关文章
|
6月前
|
算法 测试技术 C++
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
|
6月前
|
算法 测试技术 C#
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
|
3月前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
37 0
|
5月前
|
C++
C++解决线性代数矩阵转置 小实践
【6月更文挑战第3天】C++解决线性代数矩阵转置
67 2
|
6月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
6月前
|
人工智能 小程序 BI
矩阵的转置、加和乘法写入C++
矩阵的转置、加和乘法写入C++
50 0
|
6月前
|
算法 Java Go
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
45 1
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
|
6月前
|
算法 测试技术 C++
【字符串】【 LCP】【C++算法】2573找出对应 LCP 矩阵的字符串
【字符串】【 LCP】【C++算法】2573找出对应 LCP 矩阵的字符串
|
6月前
|
算法 C++
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径
|
6月前
|
传感器 人工智能 算法
掌握C++中的状态-事件回调矩阵:打造强大的有限状态机
掌握C++中的状态-事件回调矩阵:打造强大的有限状态机
113 0