【问题标题】:C++ row and columns matrix manipulationC++ 行和列矩阵操作
【发布时间】:2015-09-26 20:57:48
【问题描述】:

我创建了一个二维矩阵作为这样的向量:

vector<vector<int>> mat;

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

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

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

【问题讨论】:

  • 我没有看到替代方案,但我看到了其他问题。您是否认为所有行的大小都一样是理所当然的(前提条件)?
  • 是的,对不起。矩阵是正方形的。
  • 通过“交换行..”你的意思是列对吗?
  • 不,你不能。你必须对vector中的每个vector执行swap操作。
  • 如果你打算将它用于更复杂的任务,更优雅和有效的方法是使用诸如 eigen 之类的库。对于一个简单的自制解决方案,我也看不到替代品。可能在单个向量中展开矩阵会使行和列操作相似,但不一定更容易

标签: c++ matrix swap


【解决方案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]);

【讨论】:

  • btw std::vector& > mat;给我 Visual Studio 中的 c2535 错误
  • @darkpirate 哦,我认为这是因为引用向量有点棘手。另外,我的错误 - 你不需要使用引用向量,std::swap 的标准实现调用std::vector::swap,它的时间复杂度是恒定的。所以像往常一样使用vector&lt;vector&lt;int&gt;&gt;(我也编辑了我的答案)。
  • 哦,我明白了。您基本上使用一组索引来“模拟”交换。聪明。
  • 但进一步思考,这样你就不会交换任何东西。我的意思是,假设我想在某个地方(例如另一个类)传递精心制作的矩阵,我必须重写整个矩阵,计算成本为 n^2……我说得对吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多