Paket:
Daten:
Ziel:
Erster Versuch:
%Vor%Meine aktuelle Funktion benötigt sehr viel Zeit. Kannst du dir einen besseren Weg vorstellen? Beachten Sie, dass ich nicht nur wissen möchte, wie viele Bänder Daten an jedem Pixel haben, ich muss auch wissen, welche Bänder. Ziel ist es, die Bereiche anschließend unterschiedlich zu bearbeiten.
Beachten Sie auch, dass das reale Szenario ein 3000 x 3000 oder mehr Raster mit potenziell mehr als 10 Bändern ist.
BEARBEITEN
Einige Beispieldaten, die aus 10 versetzten Bildbereichen bestehen:
%Vor%
BEARBEITEN: Antwort aktualisiert mit Nicks Trick und Matrix-Multiplikation.
Sie könnten die folgende Funktion ausprobieren, optimiert mit Nicks Trick und Matrixmultiplikation. Der Flaschenhals füllt jetzt den Stapel mit den einzelnen Ebenen, aber ich denke, die Zeiten sind jetzt ganz in Ordnung. Speicherverbrauch ist ein bisschen weniger, aber angesichts Ihrer Daten und der Art von R, weiß ich nicht, ob Sie ein bisschen knabbern können, ohne die Leistung große Zeit zu behindern.
%Vor%Die Funktion gibt entweder einen rasterStack mit den verschiedenen Level-Kombinationen im Plot zurück (das sind nicht alle möglichen Level-Kombinationen, also haben Sie dort bereits etwas Gewinn), oder eine Matrix mit den Level-Nummer- und Level-Namen. Dies ermöglicht Ihnen beispielsweise Folgendes:
%Vor%, um die Ebenennamen für jeden Zellpunkt zu erhalten. Wie unten gezeigt, können Sie diese Matrix leicht in ein rasterLayer-Objekt einfügen.
Die Funktion:
%Vor%Proof of Concept unter Verwendung der Daten von RobertH:
%Vor%%Vor%
Ich bin nicht vertraut mit Raster, aber von dem, was ich von oben verstehe, haben Sie im Wesentlichen ein 10 * 3000 * 3000 Array, oder?
Wenn dies der Fall ist, können Sie für jede Position im Raster (zweiter und dritter Index, Currow und Curcol) einen eindeutigen Bezeichner für seine 'Zone' mit binary berechnen: run i über die 'bands' (erster Index) und Summe r [i, Currow, Curcol] * 2 ^ (i-1). Abhängig von der internen Arbeitsweise von Raster sollte es möglich sein, dies relativ schnell zu implementieren.
Dies führt zu einem neuen "Raster" der Größe 3000 * 3000, das die eindeutigen Identifikatoren jeder Position enthält. Wenn Sie dort die eindeutigen Werte finden, erhalten Sie die Zonen zurück, die tatsächlich in Ihren Daten vorkommen. Wenn Sie die Binärlogik umkehren, erhalten Sie die Bänder, die zu einer bestimmten Zone gehören.
Verzeihen Sie, wenn meine Interpretation von Raster falsch ist: dann ignorieren Sie bitte meine Gedanken. In jedem Fall keine vollständige Lösung.
Tags und Links r image-processing raster