在两列中查找匹配项并替换
Finding matches in two columns and replace
我有两列,其中每个字段都有一个 int
:
1 2
2 3
4 1
5 6
我还有一个更大的网格,像这样:
1 1 1 1 2 2 1
1 2 3 4 2 1 1
1 3 2 3 1 3 2
1 3 6 5 6 1 3
这两列让我知道我必须在较大的网格中将每个 2 替换为 1,每个 3 替换为 2,每个 1 替换为 4,因此结果可以是
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 5 5 5 1 1
如果我直接用第一个条目替换第二个 table,我将无法继续第二个条目,因为没有更多的“2”。
我该如何解决?
如果问题不是那么清楚,我给你这篇解释问题的文章,但没有给出任何具体的解决方案。
http://www.labbookpages.co.uk/software/imgProc/blobDetection.html#table
编辑:我有这样的输入:
Table 次交流
3 2
4 1
Table更正
1111111111111111111111111111
1122111111111111111111113311
1122211111111111111111133311
1112221111111111111111333111
1111222111111111111113331111
1111122211111111111133311111
1111112221111111111333111111
1111111222111111113331111111
1111111122211111133311111111
1111111111222113331111111111
1111111111122222211111111111
1111111111112222111111111111
1111111111112222111111111111
1111111111122222211111111111
1111111111222442221111111111
1111111112224444222111111111
1111111122244444422211111111
1111111222444444442221111111
1111112224444444444222111111
1111122244444444444422211111
1111222444444444444442221111
1112224444444444444444222111
1122244444444444444444422211
1122444444444444444444442211
1111111111111111111111111111
(这是一个 X)
在这种情况下很容易进行替换,因为除了 3 和 1 代替 4 之外,我没有其他对 2 的引用,但大多数情况下都是这样。
我做的是直接去把3换成2,把1换成4。
1- 复制矩阵 (d)。这个不会修改,只是一个aux.
2- 对于 (d) 中的每个单元格,将 (d)[cell] 与 2 列的第二行中的每个单元格进行比较。
2.1- 在匹配时,在你的结果矩阵中设置(之前已经复制过),第一列中相同 (d) 位置的单元格的值。
3-Return矩阵修改。
检查依赖项,在转换器列值 <2 3 1 6> 中。 <1 6> 可以轻松更改且不依赖。之后,您需要为每个整数保存状态。
取数组作为存储索引位置,即 if(grid==1) then one[]=grid.value; if(grid==2) then two[]=grid,value; 分别。
现在,改变 grid[one[]]=2;和 grid[two[]]=1; 简单。
正如您所发现的,您不能将变换一个接一个地应用于整个网格。相反,您应该为每个网格单元找到正确的转换。
根据输入分配唯一值的规则称为映射。恒等映射只是将每个值映射到自身;这些是您不会更改的元素。从恒等映射开始,然后根据您的替换对进行调整。
这是一个基于您的第一个示例的简单程序。确保每个输入值都是 map
数组中的有效索引。
#include <stdlib.h>
#include <stdio.h>
int main()
{
int grid[4][7] = {
{1, 1, 1, 1, 2, 2, 1},
{1, 2, 3, 4, 2, 1, 1},
{1, 3, 2, 3, 1, 3, 2},
{1, 3, 6, 5, 6, 1, 3},
};
int map[10] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 // identity
};
int i, j;
map[2] = 1; // adjust map to
map[3] = 2; // replacement pairs
map[1] = 4;
map[6] = 5;
// apply mapping rule
for (j = 0; j < 4; j++) {
for (i = 0; i < 7; i++) {
grid[j][i] = map[grid[j][i]];
}
}
// print grid
for (j = 0; j < 4; j++) {
for (i = 0; i < 7; i++) {
printf("%d ", grid[j][i]);
}
puts("");
}
return 0;
}
我有两列,其中每个字段都有一个 int
:
1 2
2 3
4 1
5 6
我还有一个更大的网格,像这样:
1 1 1 1 2 2 1
1 2 3 4 2 1 1
1 3 2 3 1 3 2
1 3 6 5 6 1 3
这两列让我知道我必须在较大的网格中将每个 2 替换为 1,每个 3 替换为 2,每个 1 替换为 4,因此结果可以是
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 5 5 5 1 1
如果我直接用第一个条目替换第二个 table,我将无法继续第二个条目,因为没有更多的“2”。
我该如何解决?
如果问题不是那么清楚,我给你这篇解释问题的文章,但没有给出任何具体的解决方案。
http://www.labbookpages.co.uk/software/imgProc/blobDetection.html#table
编辑:我有这样的输入:
Table 次交流
3 2
4 1
Table更正
1111111111111111111111111111
1122111111111111111111113311
1122211111111111111111133311
1112221111111111111111333111
1111222111111111111113331111
1111122211111111111133311111
1111112221111111111333111111
1111111222111111113331111111
1111111122211111133311111111
1111111111222113331111111111
1111111111122222211111111111
1111111111112222111111111111
1111111111112222111111111111
1111111111122222211111111111
1111111111222442221111111111
1111111112224444222111111111
1111111122244444422211111111
1111111222444444442221111111
1111112224444444444222111111
1111122244444444444422211111
1111222444444444444442221111
1112224444444444444444222111
1122244444444444444444422211
1122444444444444444444442211
1111111111111111111111111111
(这是一个 X)
在这种情况下很容易进行替换,因为除了 3 和 1 代替 4 之外,我没有其他对 2 的引用,但大多数情况下都是这样。 我做的是直接去把3换成2,把1换成4。
1- 复制矩阵 (d)。这个不会修改,只是一个aux.
2- 对于 (d) 中的每个单元格,将 (d)[cell] 与 2 列的第二行中的每个单元格进行比较。
2.1- 在匹配时,在你的结果矩阵中设置(之前已经复制过),第一列中相同 (d) 位置的单元格的值。
3-Return矩阵修改。
检查依赖项,在转换器列值 <2 3 1 6> 中。 <1 6> 可以轻松更改且不依赖。之后,您需要为每个整数保存状态。 取数组作为存储索引位置,即 if(grid==1) then one[]=grid.value; if(grid==2) then two[]=grid,value; 分别。 现在,改变 grid[one[]]=2;和 grid[two[]]=1; 简单。
正如您所发现的,您不能将变换一个接一个地应用于整个网格。相反,您应该为每个网格单元找到正确的转换。
根据输入分配唯一值的规则称为映射。恒等映射只是将每个值映射到自身;这些是您不会更改的元素。从恒等映射开始,然后根据您的替换对进行调整。
这是一个基于您的第一个示例的简单程序。确保每个输入值都是 map
数组中的有效索引。
#include <stdlib.h>
#include <stdio.h>
int main()
{
int grid[4][7] = {
{1, 1, 1, 1, 2, 2, 1},
{1, 2, 3, 4, 2, 1, 1},
{1, 3, 2, 3, 1, 3, 2},
{1, 3, 6, 5, 6, 1, 3},
};
int map[10] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 // identity
};
int i, j;
map[2] = 1; // adjust map to
map[3] = 2; // replacement pairs
map[1] = 4;
map[6] = 5;
// apply mapping rule
for (j = 0; j < 4; j++) {
for (i = 0; i < 7; i++) {
grid[j][i] = map[grid[j][i]];
}
}
// print grid
for (j = 0; j < 4; j++) {
for (i = 0; i < 7; i++) {
printf("%d ", grid[j][i]);
}
puts("");
}
return 0;
}