我想计算一个包含点(x,y)的数组的平均值。
是否可以使用Thrust找到表示为(x,y)点的平均点?
我也可以将数组表示为thrust :: device_vector<int>
,其中每个单元格包含点的绝对位置,即i * numColumns + j
,但我不确定平均数是否代表平均单元格。
谢谢!
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/reduce.h>
struct add_int2 {
__device__
int2 operator()(const int2& a, const int2& b) const {
int2 r;
r.x = a.x + b.x;
r.y = a.y + b.y;
return r;
}
};
#define N 20
int main()
{
thrust::host_vector<int2> a(N);
for (unsigned i=0; i<N; ++i) {
a[i].x = i;
a[i].y = i+1;
}
thrust::device_vector<int2> b = a;
int2 init;
init.x = init.y = 0;
int2 ave = thrust::reduce(b.begin(), b.end(), init, add_int2());
ave.x /= N;
ave.y /= N;
std::cout << ave.x << " " << ave.y << std::endl;
return 0;
}
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/reduce.h>
using namespace thrust::placeholders;
__device__
int2 operator+(const int2& a, const int2& b) {
return make_int2(a.x+b.x, a.y+b.y);
}
#define N 20
int main()
{
thrust::host_vector<int2> a(N);
for (unsigned i=0; i<N; ++i) {
a[i].x = i;
a[i].y = i+1;
}
thrust::device_vector<int2> b = a;
int2 ave = thrust::reduce(b.begin(), b.end(), make_int2(0, 0), _1 + _2);
ave.x /= N;
ave.y /= N;
std::cout << ave.x << " " << ave.y << std::endl;
return 0;
}
int2
类型计算定义一个加法运算符(即a+b={a.x+b.x,a.y+b.y}
),然后使用标准缩减方法计算输入的总和,最后通过元素数量进行除法运算吗? - talonmies