Mein erster Gedanke dabei ist: Reguläre Ausdrücke. Regexps lösen das genau gleiche Problem, nur in einem anderen Kontext. Man kann vielleicht dein Problem auf diesen Kontext abbilden (in welchem Fall ein Regexp es lösen kann) oder aber sich ansehen, wie Regexp-Bibliotheken wie PCRE die Eusdrücke evaluieren und dazu ein Analogon bauen.
Ich empfehle dir, dir mal String-Suchalgorithmen anzusehen; einige der Kniffe da kannst du übernehmen Beispielsweise könnte der Boyer-Moore-Algorithmus dir erlauben, die Suchzeit deutlich einzuschränken. Das ist auch der Grund, warum ich eine Suche mit direktem Vergleich der Zellwerte einer mit Vergleich der Determinanten vorziehe.
Fangen wir mal mit einem einfachen Algorithmus (tatsächlich dem naiven) an:
Der ist mit O(n⁴) wirklich langsam, aber es ist schon mal ein Anfang. Wenn wir uns jetzt den Boyer-Moore ansehen, dann haben wir zwei Heuristiken, die uns erlauben, bei Fehlern Teile der Matrix zu überspringen. Ich sehe gerade, daß ich keine Zeit mehr habe, das jetzt konkret zu erarbeiten, aber wenn man das Suchfenster anhand dieser Regeln zumindest auf der X-Achse verschiebt, kann man einiges an Aufwand einsparen.
Es müßte möglich sein, sich zu erarbeiten, ob man auch gleich mehrere Y-Zeilen überspringen kann, was natürlich den Aufwand deutlich senkt. Auch dafür habe ich jetzt leider keine Zeit mehr.
Auf jeden Fall kannst du vermeiden, für jede der (haystack.breite - needle.breite)*(haystack.höhe - needle.höhe) möglichen Positionen Vergleiche durchführen zu müssen.