?
happystudent schrieb:
Nur mal interessenhalber, was spricht eigentlich gegen:
double temp = 0.0;
for (unsigned int i = 0; i < x.size(); i++) {
temp += x[i]*y[i];
}
?
Nicht besonders viel. Das x.size() da würde mich noch am meisten stören. Müsste man mal benchmarken.
Ich habe auch viel mit kontinuierlichen Feldern zu tun und bin inzwischen bei 'ner anderen Lösung angekommen: array_ref, ein selbst gebasteltes Klassentemplate, was sich wie eine Referenz auf ein Array verhält und dementsprechend Konvertierungen
vector<T> -> array_ref<U>
array<T,N> -> array_ref<U>
T[N] -> array_ref<U>
anbietet, sofern T* nach U* konvertierbar ist. Das finde ich persönlich praktischer in vielen Fällen. Der Code könnte damit dann so aussehen:
void dotproduct(array_ref<const double> x, array_ref<const double> y)
{
auto siz = x.size();
assert(siz == y.size());
double temp = 0;
for (decltype(siz) i=0; i<siz; ++i)
temp += x[i]*y[i];
return temp;
}
oder auch per
return std::inner_product(&x[0],&x[0]+siz,&y[0],0.0);
in diesem Fall. Mit den Konvertierungen könnte man direkt Vektoren in dotproduct reinstecken.
In array_ref<T>::operator[](ptrdiff_t index) habe ich ein assert drin, was mir in der Debug-Version noch testet, ob der Index auch gültig ist.
Das kann man auch auf mehrere Dimensionen erweitern (multi_array_ref), was dann so ähnlich wie boost::multi_array arbeitet -- nur eben eine "Referenz" ist.
just my 2 cents,
kk