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

Splitten eines Arrays und anschließend separate Auswertung

 

jazzman92
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 25.09.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2020, 17:02     Titel: Splitten eines Arrays und anschließend separate Auswertung
  Antworten mit Zitat      
Moin zusammen,

ich habe ein bzw. zwei Probleme beim Verarbeiten von Daten. Es geht um die Auswertung von aufgenommenen Messdaten. Hierfür lese ich zunächst ein File mit drei Spalten und Zeilen (mehrere Millionen) ein. Beim Einlesen filter ich die Daten schon so, dass mir nur die reinen Messdaten angezeigt werden und alles an Zwischentext oder unwichtigen Informationen rausgefiltert wird. Das geschieht innerhalb von wenigen Sekunden. Die eingelesenen Messdaten sind immer durch eine Anzahl von Messpunkten (y) teilbar. Das heißt, es bleibt nie ein Rest über. Die Anzahl der Zeilen (n) ist für jeden Messpunkt (y) gleich.
Nun möchte ich jeden Messpunkt separat betrachten, auswerten und eine FFT ausführen.

Gelöst habe ich das zunächst mit einer for Schleife.
Code:

for ii = 1:n %Hochzählen der Zeilen
    Spalte1 = Datensatz(ii,1);
    Spalte2 = Datensatz(ii,2);
    Spalte3 = Datensatz(ii,3);
        if ii <= n;
        Messpunkt=[Messpunkt; Spalte1 Spalte2 Spalte3]; %Schreiben des Arrays für den Messpunkt
           if ii ==n %Wenn Zeilen == Anzahl der Zeilen für den Messpunkt entsprechen
           %Ausführen einer FFT mit den Daten des Messpunktes
           end
           if ii>n
           end
        end
end


Das funktioniert soweit auch alles aber der Code schreibt mir ja im Endeffekt das Array, dass ja durch das eingelesene File schon vorhanden ist, nochmal neu. Das möchte ich nicht und das kostet zudem unnötig viel Zeit. Gibt es einen eleganteren und schnelleren Weg für diese Art der Operation? Ich habe mich schon an cell arrays probiert aber scheiter daran.
Die FFT ist im Übrigen kein Problem.


Mein zweites Problem ist, dass ich den Code so für einen Messpunkt ausführen kann. Ich möchten das Skript allerdings nutzen um alle vorhanden Messpunkte (y) innerhalb des Files auszuwerten und die erzeugten FFT Daten abspeichern. Meine Idee wäre es, noch eine for Schleife vorzuschalten, die pro Durchlauf die FFT für jeden Messpunkt neu durchführt. Wie stelle ich das am klügsten an?

Vielen Dank im Vorraus
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.09.2020, 17:35     Titel:
  Antworten mit Zitat      
Hallo,

mit
Code:
reshape(variable, n, [])

kannst du jede Spalte der Daten in eine Matrix mit n Zeilen umwandeln. Operationen wie fft kannst du dann spaltenweise auf solche Matrizen anwenden.

Das müsstest du dann für die drei Spalten machen, z.B. in einer for-Schleife. Da du das ja nur drei Mal machen musst, wird das deutlich weniger Performance kosten als über Millionen Zeilen zu iterieren.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jazzman92
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 25.09.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2020, 10:54     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die Antwort. Ich habe es tatsächlich geschafft meine Matrix mit reshape in gleichgroße Teile zu splitten. Die Dimension liegt bei 262144x4x27 (Anzahl der Zeilen pro MP, Anzahl der Spalten, Anzahl der Messpunkte). Mein Problem ist aber, dass Spalte 2-4 jeweils eine Kopie von der ersten Spalte ist. Die Werte sollten allerdings jeweils unterschiedlich sein.

Mein Ansatz war:
Code:

C =reshape(M, 262144, 4, 27);
 

Bekommt man das Problem irgendwie behoben?

Beste Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.09.2020, 17:26     Titel:
  Antworten mit Zitat      
Hallo,

reshape erstellt keine Kopien von Werten, sondern ändert lediglich die Dimensionen eines Arrays und lässt den Rest unverändert. Meine Vermutung ist, dass die doppelten Werte schon im Original vorhanden waren.

Für weitere Unterstützung bräuchte ich leider ein reproduzierbares Beispiel.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jazzman92
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 25.09.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2020, 10:03     Titel:
  Antworten mit Zitat      
Hallo,

ich habe mich noch ein wenig an der reshape Funktion probiert und zumindest den Fehler gefunden, allerdings noch nicht die Lösung.

Ich habe eine Matrix mit 4 Spalten und jeweils 7077888 Zeilen. Diese möchte ich ja gerne in jeweils 27 Subarrays unterteilen.
Wenn ich die Matrix aufteile und jede Spalte mit ihren 7077888 separat betrachte, funktioniert die reshape Funktion ohne Probleme.
Ich habe allerdings herausgefunden, dass wenn ich die reshape Funktion auf die Matrix mit 4 Spalten und 7077888 Zeilen anwenden, jeweils alle Einträge des Subarrays nacheinander mit allen Werten aus der ersten Spalte gefüllt werden. Deshalb habe ich die ersten paar Subarrays nur Werte aus der ersten Spalte. Wenn die erste Spalte durch ist, werden die Subarrays mit Werten der zweiten Spalte gefüllt usw.

Demnach muss ich doch irgendwas an der Eingabe der reshape funktion ändern, oder?

Beste Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.09.2020, 10:22     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich das richtig verstehe, die Matrix transponieren, bevor du sie an reshape übergibst, etwa so:
Code:
C =reshape(M', 262144, 4, 27);


Ansonsten bitte ein kleines Beispiel basteln, anhanddessen ich das Problem nachvollziehen kann.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.