基于另一个向量的相似度对一个向量进行条件平均
Conditional Averaging of a vector based on similarities in another vector c++
最好给出一个例子。
假设向量A包含:
A = {3 ,2 ,1 ,4 ,6 ,3 ,8 ,4}
和向量B由:
B = {1.5,2 ,2 ,1.5,3 ,3 ,3 ,2}
向量B的唯一值是{1.5, 2, 3}
我希望结果向量RESULT为:
RESULT[0] = Average(A given B=1.5) = Average(3,4)
RESULT[1] = Average(A given B=2 ) = Average(2,1,4)
RESULT[2] = Average(A given B=3 ) = Average(6,3,8)
计算这个最有效的方法是什么?我自己的方法是遍历B的唯一元素,对于它们中的每一个,遍历每个B值,试图匹配那个唯一的数字,并在每个匹配中不断求和向量A的相应元素,同时计算匹配的数量,这样我就可以找到平均值。
这太慢了。因为我的向量A有8M个元素,向量B由0.5M个唯一值组成。
这是一个懒惰的想法:以锁步方式遍历两个向量,并将结果聚合到一个单独的容器中。例如:
#include <cassert>
#include <cmath>
#include <iostream>
#include <map>
#include <utility>
std::map<double, std::pair<int, std::size_t>> m;
assert(A.size() == B.size());
for (std::size_t i = 0; i != A.size(); ++i)
{
assert(!std::isnan(B[i]));
auto & p = m[B[i]];
p.first += A[i];
p.second += 1;
}
最后只报告结果:
for (const auto & p : m)
std::cout << "Average for bin " << p.first << " is "
<< static_cast<double>(p.second.first) / p.second.second
<< "n";
(注意键值不能是NaN:在有序映射中,NaN不是严格排序的一部分;在无序映射中,它不与自身相等。)
您可以使用(哈希)表进行循环:参见Live On Coliru
int main()
{
vector<int> A = {3 ,2 ,1 ,4 ,6 ,3 ,8 ,4};
vector<double> B = {1.5,2 ,2 ,1.5,3 ,3 ,3 ,2};
assert(A.size() == B.size());
struct accum {
uintmax_t sum = 0;
size_t number_of_samples = 0;
void sample(int val) { sum += val; ++number_of_samples; }
};
map<double, accum> average_state;
for(size_t i = 0; i<B.size(); ++i)
average_state[B[i]].sample(A[i]);
for(auto& entry : average_state)
{
accum& state = entry.second;
double average = static_cast<double>(state.sum) / state.number_of_samples;
std::cout << "Bucket " << entry.first << "taverage of " << state.number_of_samples << " samples:t" << average << "n";
}
}
打印
Bucket 1.5 average of 2 samples: 3.5
Bucket 2 average of 3 samples: 2.33333
Bucket 3 average of 3 samples: 5.66667
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 获取向量C++中第一个值和最后一个值的和
- 从多个源构造一个对象,包括一个对象向量
- 为什么一个向量上的多线程操作很慢
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 将一个向量插入另一个向量的某个位置
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 将指向给定子类的指针从一个向量复制到另一个向量
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 紧凑向量一个小的内存足迹向量