当第一个键改变时获取连续对映射的大小
Get the size of a map of pairs continous when the first key changes
我有一张成对的地图 map<pair<int, int>, int> counts
。如果映射的值大于 2,我正在遍历它并计算一些浮点数。现在我想将浮点数保存在一个向量中,该向量与我的第一个元素中相似值的数量一样大我的一对。
我的地图中的值示例:
1 1 4
1 2 5
1 3 5
1 7 5
1 29 2 .. now the first key changes so the size would be 4 (not 5, because one value is < 3)
2 10 1
2 20 4
...
我试着举了一个最小的例子,它解释得更好一点:
int main(int argc, char** argv)
{
// Create some values - both vectors have the same size
vector<pair<int, int>> pairs;
pairs.push_back(make_pair(1, 1));
pairs.push_back(make_pair(1, 2));
pairs.push_back(make_pair(1, 4));
pairs.push_back(make_pair(2, 7));
pairs.push_back(make_pair(2, 4));
pairs.push_back(make_pair(3, 5));
pairs.push_back(make_pair(3, 7));
pairs.push_back(make_pair(3, 8));
vector<float> value;
value.push_back(4);
value.push_back(5);
value.push_back(8);
value.push_back(2);
value.push_back(5);
value.push_back(6);
value.push_back(7);
value.push_back(8);
map<pair<int, int>, int> counts;
vector<vector<vector<float>>> descriptors_1, descriptors_2;
vector<float> oa_simil;
float Overall_Similarity;
for (size_t i = 0; i < pairs.size(); i++) {
counts.insert(make_pair(make_pair(pairs[i].first, pairs[i].second), value[i]));
}
for (const auto& p : counts) {
const auto& p1 = p.first.first;
const auto& p2 = p.first.second;
int count = p.second;
if (p.second >= 3) {
float S = 0;
// Two for-loops that calculate a new S for every p1, p2 combination >= 3
//S = ls_1;
// 5 Linesegments in image 1 are compared to 5 Linesegments in image 2, if p.second >= 3
for (int ls_1 = 0; ls_1 < 5; ls_1++) {
for (int ls_2 = 0; ls_2 < 5; ls_2++) {
pair<int, int> index_1, index_2;
index_1 = make_pair(p1, ls_1);
index_2 = make_pair(p2, ls_2);
// Calculate the Similarity of different pairs of line segments in a complex function
calculateSimilarity(Overall_Similarity, descriptors_1, descriptors_2, index_1, index_2);
oa_simil.push_back(Overall_Similarity);
}
// Get the maximum similarity of every single line segment in one image
float max_M = *max_element(oa_simil.begin(), oa_simil.end());
oa_simil.clear();
// Sum up the maxima -> S contains the maximum for the combination of two Linesegments p1, p2 (if p >=3)
S += max_M;
}
// Now I want to get the maximum value S for every single p1
// In the example I want the maximum S out of e.g. the 3 pairs (1,1), (1,2), (1,4).
// Trying to push the S in a vector<float> when p1 changes.
}
}
}
我已经尝试将我所有的键和 S 的值放入一个新映射中,但是当我已经遍历我的键时,这似乎是在浪费计算时间。
我想我解决了。我为我的对和 S 值创建了一个映射,并对结果进行了反转,以便可以寻找最大值。然后我把我的p1和上次迭代的p1对比,测试这个值有没有变化。
template<typename A, typename B>
std::pair<B, A> flip_pair(const std::pair<A, B> &p)
{
return std::pair<B, A>(p.second, p.first);
}
template<typename A, typename B>
std::multimap<B, A> flip_map(const std::map<A, B> &src)
{
std::multimap<B, A> dst;
std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()),
flip_pair<A, B>);
return dst;
}
int main(int argc, char** argv)
{
map<pair<int, int>, float> similarities;
multimap<float, pair<int, int>> inversed_map;
...
// Get the maximum similarity of every single line segment in one image
float max_M = *max_element(oa_simil.begin(), oa_simil.end());
oa_simil.clear();
// Sum up the maxima -> S contains the maximum for the combination of two Linesegments p1, p2 (if p >=3)
S += max_M;
}
similarities.insert(make_pair(make_pair(p1, p2), S));
inversed_map = flip_map(similarities);
if ((p1 > p1_old) && ((int)inversed_map.size() > 0)) {
// Sort the vector and keep track of the indexes of the pair.
auto it = inversed_map.rbegin();
cout << it->second.first << " " << it->second.second << " " << it->first << endl;
similarities.clear();
inversed_map.clear();
}
p1_old = p1;
}
}
}
我有一张成对的地图 map<pair<int, int>, int> counts
。如果映射的值大于 2,我正在遍历它并计算一些浮点数。现在我想将浮点数保存在一个向量中,该向量与我的第一个元素中相似值的数量一样大我的一对。
我的地图中的值示例:
1 1 4
1 2 5
1 3 5
1 7 5
1 29 2 .. now the first key changes so the size would be 4 (not 5, because one value is < 3)
2 10 1
2 20 4 ...
我试着举了一个最小的例子,它解释得更好一点:
int main(int argc, char** argv)
{
// Create some values - both vectors have the same size
vector<pair<int, int>> pairs;
pairs.push_back(make_pair(1, 1));
pairs.push_back(make_pair(1, 2));
pairs.push_back(make_pair(1, 4));
pairs.push_back(make_pair(2, 7));
pairs.push_back(make_pair(2, 4));
pairs.push_back(make_pair(3, 5));
pairs.push_back(make_pair(3, 7));
pairs.push_back(make_pair(3, 8));
vector<float> value;
value.push_back(4);
value.push_back(5);
value.push_back(8);
value.push_back(2);
value.push_back(5);
value.push_back(6);
value.push_back(7);
value.push_back(8);
map<pair<int, int>, int> counts;
vector<vector<vector<float>>> descriptors_1, descriptors_2;
vector<float> oa_simil;
float Overall_Similarity;
for (size_t i = 0; i < pairs.size(); i++) {
counts.insert(make_pair(make_pair(pairs[i].first, pairs[i].second), value[i]));
}
for (const auto& p : counts) {
const auto& p1 = p.first.first;
const auto& p2 = p.first.second;
int count = p.second;
if (p.second >= 3) {
float S = 0;
// Two for-loops that calculate a new S for every p1, p2 combination >= 3
//S = ls_1;
// 5 Linesegments in image 1 are compared to 5 Linesegments in image 2, if p.second >= 3
for (int ls_1 = 0; ls_1 < 5; ls_1++) {
for (int ls_2 = 0; ls_2 < 5; ls_2++) {
pair<int, int> index_1, index_2;
index_1 = make_pair(p1, ls_1);
index_2 = make_pair(p2, ls_2);
// Calculate the Similarity of different pairs of line segments in a complex function
calculateSimilarity(Overall_Similarity, descriptors_1, descriptors_2, index_1, index_2);
oa_simil.push_back(Overall_Similarity);
}
// Get the maximum similarity of every single line segment in one image
float max_M = *max_element(oa_simil.begin(), oa_simil.end());
oa_simil.clear();
// Sum up the maxima -> S contains the maximum for the combination of two Linesegments p1, p2 (if p >=3)
S += max_M;
}
// Now I want to get the maximum value S for every single p1
// In the example I want the maximum S out of e.g. the 3 pairs (1,1), (1,2), (1,4).
// Trying to push the S in a vector<float> when p1 changes.
}
}
}
我已经尝试将我所有的键和 S 的值放入一个新映射中,但是当我已经遍历我的键时,这似乎是在浪费计算时间。
我想我解决了。我为我的对和 S 值创建了一个映射,并对结果进行了反转,以便可以寻找最大值。然后我把我的p1和上次迭代的p1对比,测试这个值有没有变化。
template<typename A, typename B>
std::pair<B, A> flip_pair(const std::pair<A, B> &p)
{
return std::pair<B, A>(p.second, p.first);
}
template<typename A, typename B>
std::multimap<B, A> flip_map(const std::map<A, B> &src)
{
std::multimap<B, A> dst;
std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()),
flip_pair<A, B>);
return dst;
}
int main(int argc, char** argv)
{
map<pair<int, int>, float> similarities;
multimap<float, pair<int, int>> inversed_map;
...
// Get the maximum similarity of every single line segment in one image
float max_M = *max_element(oa_simil.begin(), oa_simil.end());
oa_simil.clear();
// Sum up the maxima -> S contains the maximum for the combination of two Linesegments p1, p2 (if p >=3)
S += max_M;
}
similarities.insert(make_pair(make_pair(p1, p2), S));
inversed_map = flip_map(similarities);
if ((p1 > p1_old) && ((int)inversed_map.size() > 0)) {
// Sort the vector and keep track of the indexes of the pair.
auto it = inversed_map.rbegin();
cout << it->second.first << " " << it->second.second << " " << it->first << endl;
similarities.clear();
inversed_map.clear();
}
p1_old = p1;
}
}
}