C ++行和列矩阵操作

时间:2015-07-08 18:53:23

标签: c++ matrix swap

我已经创建了一个2D矩阵作为这样的矢量矢量:

vector<vector<int>> mat;

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

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

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

1 个答案:

答案 0 :(得分:1)

如果你认为“elenance”是一个可以为你做所有这些事情的STL函数,那么就没有这样的功能了。 STL的目的不是让你的代码尽可能简单,C ++的创建者只会添加STL的东西:

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

所以,只需自己实施即可。

如果您不想使用for (;;)循环,因为它在某些时候不是“优雅”,那么您可以这样做:

/* 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)中),那么您可以使用此实现(这需要额外的空间) ):

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]);