6 Stimmen

Umwandlung einer verschachtelten Liste ohne Kopieren oder Präzisionsverlust

Ich verwende Mathematica 7, um einen großen Datensatz zu verarbeiten. Der Datensatz ist ein dreidimensionales Array aus vorzeichenbehafteten ganzen Zahlen. Die drei Ebenen kann man sich wie folgt vorstellen X Punkte pro Schuss , Y Schüsse pro scannen. y Z Scans pro einstellen. .

Ich habe auch eine "Nullstellungsaufnahme" (mit X Punkte, die sind Vorzeichenbehaftete Brüche von ganzen Zahlen ), die ich von jeder Aufnahme im Datensatz subtrahieren möchte. Danach brauche ich den ursprünglichen Datensatz nie wieder.

Wie kann ich diese Transformation durchführen, ohne dabei neue Kopien des Datensatzes oder Teile davon zu erstellen? Der Datensatz befindet sich im Speicher, und ich möchte jedes Element durchsuchen und es an dieser Stelle im Speicher ändern, ohne es dauerhaft an einen anderen Speicherort zu kopieren.

Der folgende in sich geschlossene Code fasst alle Aspekte dessen zusammen, was ich zu tun versuche:

(* Create some offsetted data, and a zero data set. *)
myData = Table[Table[Table[RandomInteger[{1, 100}], {k, 500}], {j, 400}], {i, 200}];
myZero = Table[RandomInteger[{1, 9}]/RandomInteger[{1, 9}] + 50, {i, 500}];

(* Method 1 *)
myData = Table[
   f1 = myData[[i]];
   Table[
     f2 = f1[[j]];
     f2 - myZero, {j, 400}], {i, 200}];

(* Method 2 *)
Do[
 Do[
  myData[[i]][[j]] = myData[[i]][[j]] - myZero, {j, 400}], {i, 200}]

(* Method 3 *)
Attributes[Zeroing] = {HoldFirst};
Zeroing[x_] := Module[{}, 
   Do[
     Do[
       x[[i]][[j]] = x[[i]][[j]] - myZero, {j, Length[x[[1]]]}
       ], {i, Length[x]}
     ]
 ];

(Hinweis: Hut ab vor Aaron Honecker für Methode #3).

Auf meinem Rechner (Intel Core2 Duo CPU 3,17 GHz, 4 GB RAM, 32-Bit Windows 7) verbrauchen alle drei Methoden etwa 1,25 GB Arbeitsspeicher, wobei Nr. 2 und Nr. 3 etwas besser abschneiden.

Wenn es mir nichts ausmacht, die Präzision zu verlieren, wickeln N[ ] um die Innereien von myData y myZero bei der Erstellung erhöht ihre Größe im Speicher anfangs um 150 MB, reduziert aber den Speicherbedarf für das Nullsetzen (durch die obigen Methoden #1-#3) von 1,25 GB auf nur 300 MB! Das ist meine Arbeitslösung, aber es wäre toll zu wissen, wie man dieses Problem am besten lösen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X