C++ 行和列矩阵操作

C++ row and columns matrix manipulation

我创建了一个二维矩阵作为向量的向量,如下所示:

vector<vector<int>> mat;

现在我需要交换矩阵的行和列,例如:

row 0 swapped with row 4 
column 5 swapped with column 1

行不是问题,因为有 stl 库的 swap() 函数。交换行虽然看起来很成问题,因为当然,它们不被视为一个原子结构。所以在这一点上我真的卡住了......我考虑过粗暴地交换我感兴趣的行的每个元素,但它看起来很不优雅。知道如何实现我的目标吗?

如果您将 "elenance" 视为可以为您完成所有这些事情的 STL 函数,那么就没有这样的函数了。 STL 的目的不是让您的代码尽可能简单,C++ 的创建者只向 STL 添加以下内容:

  • 用当前语言的工具真的很难实现
  • 需要编译器特殊支持的事情(特殊优化等)
  • 一些变得普遍的元素

所以,还是自己实现吧。

如果你不想使用 for (;;) 循环,因为它在某些时候不是 "elegant",那么你可以这样做:

/* swapping column i and j */
std::vector<std::vector<T>> mat;
std::for_each(mat.begin(), mat.end(), [i,j](std::vector<int>& a)
        { std::swap(a[i], a[j]); });

更新: 如果速度对您很重要,并且您希望交换列的速度与交换行的速度一样快(在 O(1) 中),那么您可以使用此实现(这需要额外的 space)):

std::vector<std::vector<int>> mat;

/* preprocessing */    
std::vector<int> permutation(mat[0].size());
std::iota(permutation.begin(), permutation.end(), 0);

/* now, if you need to get the element mat[i][j] */
mat_i_j = mat[i][ permutation[j] ];

/* if you want to swap column i and j */
std::swap(permutation[i], permutation[j]);