用迭代法求区域最大元
Finding regional maximum elements by iterative method
假设我将在下面的矩阵中找到区域最大值元素。区域最大值是具有相同值t的8连通元素,其外部边界值均小于t。在这种情况下,期望的结果是一个等于8
的元素和五个等于9
的元素。
1 1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 1 1 1
1 1 2 8 2 2 2 9 1 1
1 1 1 1 2 2 9 9 9 1
1 2 2 2 2 2 2 9 1 1
1 1 1 1 1 1 1 1 1 1
对于第一种情况,由于8
是最大的,所以很容易从它的8连通邻居中挑选出8
。伪代码:
for (i = 0; i < 10; i++) {
for (j = 0; j < 6; j++) {
if element(i, j) > AllOfNeighbors(i, j)
RecordMaxElementIndex(i, j);
}
}
但是对于第二种情况,我感到困惑。这一次9
大于它的一些邻居,并且等于其他邻居。伪代码是:
for (i = 0; i < 10; i++) {
for (j = 0; j < 6; j++) {
// Start iteration
if element(i, j) > AllOfNeighbors(i, j)
RecordMaxElementIndex(i, j);
else if element(i, j) > SomeOfNeighbors(i, j) &&
element(i, j) == TheOtherNeighbors(i, j)
RecordTheOtherNeighborsIndex(i, j);
// Jump to the start now
}
}
例如,当(i, j)
为(7, 2)
时,在下一轮迭代时,将记录(6, 3)
, (7, 3)
和(8, 3)
的元素。我不确定在这里使用迭代法是否合适,但我认为可以将TheOtherNeighbors(ii, jj)
视为element(i, j)
,重复相同的过程来寻找区域最大值。此外,(6, 3)
不能再与(7, 2)
、(7, 3)
、(8, 3)
进行比较,以免出现无限循环。那么如何实现迭代法呢?任何指南都会有帮助的。
据我所知,您可以使用Disjoint-set_data_structure创建连接的组件,并标记不是最大的组件…
伪代码:
DisjointSet disjointSet[10][6]
// Init disjointSet
for (i = 0; i < 10; i++) {
for (j = 0; j < 6; j++) {
disjointSet[i][j].MakeSet({i, j});
disjointSet[i][j].MarkAsMaximal(); // extra flag for your case
}
}
// Create Connected component and mark as not maximal
for (i = 0; i < 10; i++) {
for (j = 0; j < 6; j++) {
for (auto neighborDisjointSet : NeighborsWithSameValue(i, j)) {
Union(disjointSet[i][j], neighborDisjointSet);
}
if (element(i, j) < AnyOfNeighbors(i, j)) {
disjointSet[i][j].MarkAsNotMaximal();
}
for (auto neighborDisjointSet : NeighborsWithSmallValue(i, j) {
neighborDisjointSet.MarkAsNotMaximal();
}
}
}
// Collect result.
std::set<DisjointSet> maximumRegions;
for (i = 0; i < 10; i++) {
for (j = 0; j < 6; j++) {
if (disjointSet[i][j].IsMarkAsMaximal) {
maximumRegions.insert(disjointSet[i][j]);
}
}
}
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- 从卷或区域中的起点向外迭代,而不对其进行排序
- 如何检查迭代器是否形成连续的内存区域
- 并行区域的OpenMP迭代for循环
- 用迭代法求区域最大元
- Boost:在图像区域上迭代