Mantén la atención ya que en esta sección vas a hallar el resultado que buscas.Este enunciado fue evaluado por nuestros expertos para asegurar la calidad y exactitud de nuestro post.
Solución:
Como sugiere correctamente la otra respuesta de herradura, tendrá que usar un bucle para calcular la varianza, de lo contrario, la declaración
var = ((matriz[n] – media) * (matriz[n] – media)) / numPuntos;
solo considerará un solo elemento del array.
Acabo de mejorar el código sugerido de herradura:
var = 0;
for( n = 0; n < numPoints; n++ )
var += (Array[n] - mean) * (Array[n] - mean);
var /= numPoints;
sd = sqrt(var);
Su suma funciona bien incluso sin usar bucle porque está usando acumular función que ya tiene un bucle dentro, pero que no es evidente en el código, eche un vistazo al comportamiento equivalente de acumular para una comprensión clara de lo que está haciendo.
Nota:X ?= Y
es corto para X = X ? Y
dónde ?
puede ser cualquier operador. También puedes usar pow(Array[n] - mean, 2)
tomar el cuadrado en lugar de multiplicarlo por sí mismo haciéndolo más ordenado.
Aquí hay otro enfoque usando std::accumulate
pero sin usar pow
. Además, podemos usar una función anónima para definir cómo calcular la varianza después de calcular la media. Tenga en cuenta que esto calcula la varianza de muestra imparcial.
#include
#include
#include
template
T variance(const std::vector &vec)
const size_t sz = vec.size();
if (sz == 1)
return 0.0;
// Calculate the mean
const T mean = std::accumulate(vec.begin(), vec.end(), 0.0) / sz;
// Now calculate the variance
auto variance_func = [&mean, &sz](T accumulator, const T& val)
return accumulator + ((val - mean)*(val - mean) / (sz - 1));
;
return std::accumulate(vec.begin(), vec.end(), 0.0, variance_func);
Un ejemplo de cómo usar esta función:
#include
int main()
const std::vector vec = 1.0, 5.0, 6.0, 3.0, 4.5;
std::cout << variance(vec) << std::endl;
Comentarios y calificaciones
Si piensas que te ha resultado de utilidad nuestro post, agradeceríamos que lo compartas con otros juniors y nos ayudes a dar difusión a este contenido.