Si su código está segfaulting, entonces ese es un problema de corrección, no un problema de eficiencia.
para lograr la "T [i] = u [i] + V [i] para todos los i", me gustaría hacer básicamente lo que hizo:
assert(u.size() == v.size()); // will fail with your initialization code, since
// your "result" has size 0, not size 10.
// perhaps do u.resize(v.size());
for (size_t i = 0; i < u.size(); ++i) {
u[i] += v[i];
}
Si realmente se preocupan por el rendimiento de su programa (es decir, ha escrito una versión básica y es tan lenta que su programa no cumple con ciertos requisitos, y ha demostrado que este es el código donde se emplea la mayor parte del tiempo), puede intentar:
- activando muchas optimizaciones en su compilador (en realidad, generalmente lo hago de manera predeterminada incluso cuando no hay un problema de rendimiento),
- utilizando iteradores en lugar de índices (rara vez hace mucha diferencia, pero es bastante fácil comparar los dos),
- desenrollando el ciclo un poco (puede hacer una diferencia de velocidad que valga la pena, pero eso es bastante sensible al caso particular, fomenta los errores de codificación).
- buscando instrucciones SIMD específicas de la plataforma en lugar de C++. A continuación, utilice ensamblador integrado o intrínseco del compilador para esas instrucciones.
Sin embargo, no tiene que preocuparse por el rendimiento antes de que su código sea correcto ;-). "Hacer que funcione, que sea justo, que sea rápido" es un lema razonable, aunque a menudo no es necesario ir tan lejos como el paso 3.
std::valarray
en realidad tiene exactamente el operator+=
desea. Antes de reemplazar todos sus vectores con valarrays, tenga en cuenta que esto no significa necesariamente que sea "más eficiente" que un simple bucle. No sé cuán seriamente los implementadores toman valarray
. Siempre puedes mirar la fuente en tu implementación.Tampoco sé por qué la funcionalidad aritmética de datos múltiples de valarray
no se definió como parte de vector
, pero generalmente hay una razón.
¿Le publicar algo de código compilables? "Esto me da un segfault" no es particularmente útil sin ver cómo esos vectores se inicializan. El problema más probable es que uno de los vectores sea más largo que el otro. Es realmente difícil saber dónde está el código incorrecto sin ver todo el código :-) –
http://www.boost.org/doc/libs/1_43_0/libs/numeric/ublas/doc/operations_overview.htm – Anycorn