2016-10-02 5 views
0

Ich brauche die eine Operation auf einem Eigen VectorXi, durchzuführen, die zu MATLAB changem entsprechen():Eigen: Effizientes Äquivalent zu MATLABs changem()?

http://www.mathworks.com/help/map/ref/changem.html

Im Moment, wie ich dies tue, über die Werte im Array looping und Durchführen der Neuabbildung mit einem Schalter/Fall-Block. Ich schätze, das ist nicht besonders effizient.

Gibt es einen schnellen Weg, dies mit Eigen zu tun? Geschwindigkeit ist entscheidend für meine Anwendung.

Antwort

1

Schalter/Gehäuse wird besonders langsam und unflexibel sein.

changem nimmt eine Matrix und zwei Vektoren von Werten, neu und alt. Wenn ein Eintrag in der alten Liste gefunden wird, wird er durch den entsprechenden Eintrag in der neuen Liste ersetzt. Es wird also von Natur aus ziemlich langsam sein, Sie müssen die gesamte Matrix durchlaufen, die alte Liste durchsuchen und, wenn und ein Eintrag gefunden wird, durch die neue Liste ersetzen. Wie können Sie es beschleunigen? Erstens, hardcodiere nicht als Schalter/Fall. Ein moderner Compiler wird möglicherweise eher zu einer Schleife als zu vielen Sprüngen optimiert, aber ich würde es nicht garantieren. Und der Ansatz ist unflexibel. Zweitens können Sie den "alten" Vektor sortieren und eine binäre Suche anstelle einer linearen verwenden. Das wird nur erheblich helfen, wenn der alte Vektor lang ist. Drittens können Sie das nutzen, was Sie über die Matrix wissen. Sind die alten Werte in bestimmten Regionen eingeschränkt? Gibt es einen Wert, der überwältigend wahrscheinlich ist und zuerst getestet werden kann? Können Sie schnell einige Werte ausschließen, die in der alten Liste nicht erlaubt sind (zu groß, zu klein, nicht ganzzahlig).

Sind die alten Werte ganze Zahlen und können Sie Indexierung verwenden? Oder generalisiere das auf Hashing. Das wäre sogar schneller als eine binäre Suche, allerdings mit mehr Aufwand für Hashing. Können Sie das Problem auf andere Weise lösen und einen Index der Matrix xy-Koordinaten als Wert beibehalten?

Es gibt viele Ansätze. Implementieren Sie die Matlab-Funktion einfach naiv in C als ersten Schritt. Es könnte schnell genug sein.

+0

Danke für Ihren Kommentar. Am Ende habe ich das nur als Nachschlagetabelle implementiert, da es nur 8 mögliche Werte gibt (allerdings sind die Vektoren, auf denen ich den Swap ausführen möchte, ziemlich groß - Tausende von Elementen). Das heißt, mit dem Loswerden des Schalters/Falles und einiger sorgfältiger Implementierung ist es jetzt 10x schneller. – NOP

Verwandte Themen