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]);
我创建了一个二维矩阵作为向量的向量,如下所示:
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]);