求c++矩阵中最大元素的索引
Finding the index of the maximum element in c++ matrix?
我正在将python(sage)程序转换为C++程序。
我需要编写一个处理矩阵的函数,并且我需要找到矩阵中最大元素的索引。
我想尽可能高效地完成这项工作,但到目前为止,我想到的唯一一件事似乎效率很低。
我的算法的伪代码是
- 给定一个矩阵,在每行中调用max_element函数
- 创建一个向量并推送从max_element返回的迭代器(_back)
- 取消引用迭代器,再次调用max_element函数
- 查找列的索引
- 查找行的索引
这将是非常混乱和缓慢的。。有人有更好的算法来完成这项任务吗?非常感谢。
自己编写外循环可能最简单:
if (matrix.size() == 0 || matrix[0].size() == 0) {
// matrix is empty, handle special case
throw std::logic_error("empty");
}
int best = matrix[0][0];
size_t rowidx = 0, colidx = 0;
for (auto it = matrix.begin(); it != matrix.end(); ++it) {
auto maxit = max_element(it->begin(), it->end());
if (*maxit > best) {
best = *maxit;
rowidx = it - matrix.begin();
colidx = maxit - it->begin();
}
}
或者,您可以编写一个迭代整个矩阵的迭代器类:
struct MatrixIterator : std::iterator<std::forward_iterator_tag, int> {
typedef vector<vector<int> > Matrix;
Matrix &m;
size_t rowidx, colidx;
explicit MatrixIterator(Matrix &m, size_t row = 0, size_t col = 0) : m(m), rowidx(row), colidx(col) {};
int &operator*() { return m[rowidx][colidx]; }
MatrixIterator &operator++() {
++colidx;
if (colidx == m[rowidx].size()) {
colidx = 0;
++rowidx;
}
return *this;
}
MatrixIterator operator++(int) {
MatrixIterator result = *this;
++*this;
return result;
}
bool operator==(const MatrixIterator &rhs) {
return rowidx == rhs.rowidx && colidx == rhs.colidx;
}
bool operator!=(const MatrixIterator &rhs) {
return ! (*this == rhs);
}
static MaxtrixIterator end(Matrix &m) {
return MatrixIterator(m, m.size() - 1, m.back().size());
}
};
现在你可以做:
MatrixIterator result = std::max_element(MatrixIterator(m), MatrixIterator::end(m));
size_t rowidx = result.rowidx, colidx = result.colidx;
我假设您将数据存储在二维向量中。
#include <vector>
#include <algorithm>
vector<vector<int>> Matrix
你应该能够像这样迭代你的矩阵,以获得最大的元素
int MaxValue = 0;
for(int i = 0; i < Matrix.size(); i++) {
if( *std::max_element(Matrix[i].begin(),Matrix[i].end()) < MaxValue ) continue;
MaxValue = *std::max_element(Matrix,Matrix+Columns);
}
相关文章:
- 在对向量中查找元素的索引
- 当该数组的索引中没有元素时,指针指向什么?
- 如何在 STL 函数中找到传递给谓词的元素的索引?
- 如何在C++中递归地找到max元素的索引?
- 编译器(Visual C++)如何优化按索引访问矢量元素?
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 使用推力根据索引更改某些元素的值
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- CPtrList - 如何获取元素的索引?
- 获取结构 c++ 中元素的索引
- C++ STL 数据结构常时按索引推送/弹出/随机访问,并具有指向元素的可靠指针
- 矢量指针索引处的读取元素
- C++函数返回两个 char 数组的相同索引元素
- 特征:类似 numpy 的元素索引
- 如何在另一个数组中找到一个未排序数组的不同元素索引?
- C 无法使用嵌套环将数组的元素索引
- Opencv Mat的元素索引产生垃圾
- 在c++中,当元组的元素索引在运行时已知时,是否有可能获得该元素的类型?
- 按内容访问QVector元素索引
- C++ 矢量元素索引