WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matrixeinträge filtern (Datenreduktion)

 

TheThunder

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2009, 13:47     Titel: Matrixeinträge filtern (Datenreduktion)
  Antworten mit Zitat      
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
 


Da das ganze für 10000 Bilder wiederholt werden soll ist diese Lösung aber viel viel zu langsam. Gibt es da eine schnellere Methode?

Schon mal vielen Dank!
Marc


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2009, 14:15     Titel:
  Antworten mit Zitat      
Code:

    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
 


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:
Code:
nicht_null_indizes = find(C ~= 0)

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.
Code:
[x, y] = ind2sub(size(C), nicht_null_indizes)
.

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 11.03.2009, 14:19     Titel:
  Antworten mit Zitat      
Hallo,

oder gleich:

Code:


[rows,cols]=find(C==0)

 


Ist jetzt, die Position wo Nullen sind, wegen Datenreduktion.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
TheThunder

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2009, 14:49     Titel:
  Antworten mit Zitat      
Tausend danke euch beiden! Werde es gleich mal ausprobieren!
 
Alpha23
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.09.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2009, 11:03     Titel:
  Antworten mit Zitat      
Wie wär's mit
Code:

?

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...
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.