Estoy tratando de calcular el promedio de una cierta matriz que contiene puntos (x, y).
¿es posible usar el empuje para encontrar el punto promedio representado como un punto (x, y)? también podría representar la matriz como thrust::device_vector<int>
cuando cada celda contiene la posición absoluta del punto, lo que significa i*numColumns + j
aunque no estoy seguro de que el número promedio represente la celda promedio.
Gracias! respuestacómo calcular un promedio de una matriz int2 utilizando Thrust
5
A
Respuesta
8
#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;
}
6
de Keveman es correcta, sólo quiero añadir un consejo útil que requiere código, así que voy a poner aquí en vez de en los comentarios.
Thrust 1.5 agrega marcadores de posición lambda, lo que puede hacer que el enfoque de @ keveman sea aún más simple. En lugar de un funtor, simplemente defina operator+
para int2
, y luego reemplace la creación de instancias del funtor con la expresión de marcador de posición _1 + _2
lambda. También puede reemplazar la declaración explícita de init
con una llamada al make_int2()
(proporcionada por CUDA). Nota: int2 operator+
se define en el encabezado "vector_math.h" del SDK de muestra del código CUDA, pero lo defino a continuación para dejarlo en claro (ya que ese archivo no es una parte estándar de CUDA).
#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;
}
Cuestiones relacionadas
- 1. Calcular calificación promedio
- 2. ¿Cálculo promedio de una lista de matriz?
- 3. Calcular el color promedio de un área en una imagen
- 4. calcular promedio móvil exponencial en python
- 5. ¿Puedo calcular el promedio de estos números?
- 6. ¿cómo puedo calcular una media móvil ponderada utilizando pandas
- 7. Calcular promedio móvil exponencial en una cola en C#
- 8. SQL Seleccionar instrucción para calcular una columna promedio en ejecución
- 9. Calcular el promedio de la columna de la consulta MYSQL
- 10. push_back usando la biblioteca Thrust
- 11. Consulta de MySQL: ¿Cómo calcular el promedio de valores en una fila?
- 12. Agrupación de matriz numpy 2D en promedio
- 13. Completar una matriz utilizando un bucle foreach
- 14. ¿Cómo calcular la longitud euclidiana de una matriz sin bucles?
- 15. General - ¿Hay alguna forma de calcular un promedio basado en un promedio existente y dados nuevos parámetros para el promedio resultante?
- 16. ¿Cómo calcular el tiempo promedio de espera y el tiempo promedio de respuesta en la programación SJF?
- 17. Ejecución gaussiano - ¿Cómo calcular matriz de convolución (kernel)
- 18. calcular una suma de los tiempos de texto utilizando SQL
- 19. matriz numpy promedio pero conserva la forma
- 20. Scala: ¿forma idiomática de calcular sumas de matriz intercalada?
- 21. matriz round robin simple (promedio móvil) en C#
- 22. ¿Thrust es síncrono o asíncrono?
- 23. Consultar una matriz de objetos utilizando linq
- 24. Impresión de matriz PHP utilizando un bucle
- 25. STL thrust multiple vector transform?
- 26. Calcular el promedio de una lista de manera eficiente en Haskell
- 27. ¿Cómo calcular el promedio de una columna y luego incluirla en una consulta de selección en Oracle?
- 28. Eliminar duplicados de una matriz de enteros grandes utilizando Java
- 29. El establecimiento de un valor en una matriz multidimensional utilizando una matriz de claves
- 30. Intentando obtener un número dentro de una matriz que es el doble del promedio
no puedes calcular definir un operador de adición para el 'tipo int2' (es decir.' A + b = {a.x + bx, a.y + por} '), a continuación, utilizar el estándar reducción para calcular la suma sobre la entrada, luego dividir a través de la cuenta del elemento? – talonmies
Puede usar un operador si usa los marcadores de posición lambda de Thrust 1.5 + (consulte la respuesta de mi complemento a continuación). – harrism