Hallo,
ich bin ganz neu in Matlab und kämpfe jetzt mit einem hoffentlich kleinen Problem.
Ich habe eine Matrix (256*256) einer CCD-Kamera die Daten werden Offset und Commonmode korrigiert anschließend werden mittels Noisemap die Signale vom Rauschen getrennt und das Rauschen durch Nullen ersetzt. Resulat ist eine Matrix mit 65k Einträgen von denen ca. 63k Einträge Nullen sind.
Nun möchte ich zur Datenreduktion alle Einträge ungleich Null mit Spalten und Zeileninformation abspeichern. Momentan läuft das so:
Code:
while k <= number_dataframes
frameheader=fread(fid_data,32,'int16');
C=fread(fid_data,[size_x,size_y],'int16');
C=transpose(fliplr(C));
C=C-Kor_Offsetmap-Commonmode;
C(C < Schwelle_Min | C > Schwelle_Max) = 0;
for x=1:size_x
for y=1:size_y
if C(y,x) > 0
Enddaten=[Enddaten;k,x,y,C(y,x)];
end end end
k=k+1;
end
Das sieht arg nach C, C++, ... aus und dürfte an der ganzen Geschichte auch der Flaschenhals sein.
Matrizen in Schleifen vergrößern ist in Matlab ziemlich lahm, weil nicht das original vergrößert wird, sondern eine neue, größere Matrix angelegt wird, in die die neuen Werte dann reinkopiert werden. Sprich, für jede Matrixvergrößerung muss erneut ein Speicherplatz gefunden und komplett befüllt werden. Das kostet Zeit. Effizienter ist es, den Speicherplatz in Endgröße mit zeros einmal zu allozieren und später nur noch die Werte einzufüllen - die Endgröße muss natürlich dazu bekannt sein.
In deinem Fall willst Du eigentlich nur Elemente finden, die von Null verschieden sind. Dabei könnte Dir zum Beispiel find behilflich sein:
liefert einen Vektor mit allen Indizes, wo C nicht null ist. Das entspricht in Deinem code x und y. Die Umwandlung von fortlaufendem Index in x-y-Darstellung kannst Du mit ind2sub machen.
Diese Daten musst Du dann nur noch in deinen End-Vektor verpacken. Sollte wesentlich schneller sein, als das geschleife.
Den Endvektor würde ich dann dreidimensional machen, wobei k der dritte Index ist. Dann kannst Du später mit Endwerte(:, :, k) bequem die nicht-null-Werte eines Frames abgreifen.
Sparse-Matrizen speichern doch nur die Nicht-Null-Werte, oder? Wenn's dir nur um Speicherbedarf geht, dann wäre das die schnellste Lösung...
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.