Ich bin gerade dabei, Code von C++ nach CUDA zu übertragen, während ich mit thrust::device_vector
s arbeite. Jetzt gibt es eine Funktion, um den Gradienten zu berechnen, wo ich auch Zugriff auf nicht nur das aktuelle Element, sondern auch die umgebenden Elemente haben muss. In dem ursprünglichen Code schrieb ich folgende:Berechnen des Gradienten über einen Schub :: device_vector
void calc_grad(Complex *grad, const Complex *data, const int size)
{
for (int i = 1; i < size - 1; i++) {
grad[i] = 0.5 * (data[i + 1] - data[i - 1]);
}
grad[0] = data[1] - data[0];
grad[size - 1] = data[size - 1] - data[size - 2];
}
Ist es möglich, ein functor
für Schub aus, dass zu schaffen, so dass ich es in thrust::transform()
anrufen kann? Bis jetzt kann ich immer nur auf ein Element zugreifen, ohne die umgebenden Elemente zu erhalten. Oder ist es sowieso nicht möglich, je nach Element vorher und nachher, welche geändert werden?
Die Formel für den Code kam aus der matlab
Funktion gradient
, hier gezeigt: http://se.mathworks.com/help/matlab/ref/gradient.html?requestedDomain=www.mathworks.com
Sie sollten wirklich einige Zeit mit dem Lesen der Schub Dokumentation verbringen: https://thrust.github.io/doc/group__transformations.html#gaa41d309b53fa03bf13fe35a184148400 – talonmies
Diese Funktion ist nicht das tut, was meine Funktion tut. Gibt es noch andere ähnliche Funktionen? –
Sie können jedes beliebige Bestellgenauigkeitsschema aus sukzessiven Differenzen berechnen, die mit 'benachbarten_Unterschieden' berechnet wurden, einschließlich der zentralen Differenz zweiter Ordnung, die Sie hier gezeigt haben. – talonmies