parfor funktioniert nicht, andere Programmierung gesucht - Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Studierende:
Praktikum - Optische Verbrennungsdiagnostik von Zündsystemen mit MATLAB
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Berlin

Praktikant (w/m) Toolentwicklung Matlab
Branche: Beratung, Expertise, Fahrzeugtechnik, Fahrzeugteile, Technische Dienstleistungen
MBtech Group GmbH & Co. KGaA - Fellbach

Abschlussarbeit / Praktikum: Entwicklung Matlab (m/w)
Branche: Informationstechnologie, Elektrotechnik, Elektronik
GIGATRONIK Technologies GmbH - Ulm

Work & Study - Mathe² / Simulation - Optimierung & Parallelisierung
Branche: Luft-, Raumfahrttechnik
MBtech Group GmbH & Co. KGaA - Fellbach, Sindelfingen

Praktika, Abschlussarbeiten, Werkstudentenstellen
Branche: Informationstechnologie
MicroNova AG - München/Vierkirchen

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

parfor funktioniert nicht, andere Programmierung gesucht

 

rollmops94

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2018, 11:39     Titel: parfor funktioniert nicht, andere Programmierung gesucht
  Antworten mit Zitat      
Hallo,

ich habe eine Anwendung, in der ich Signale mit einem Bandpass filtern möchte. Die Signale enthalten aufgenommene Messwerte und sind ca 100Mio bis 200Mio Werte lang.

Ich habe hier einen Beispielcode, der verdeutlichen soll was ich machen muss:

A =[ 1 7 4 8 9 4 4 8 0 2 4 1 7 9 4 9 2 8 4 6 7 3 5 6 0 6 1 3 1 5];
B =[ 1 10 20];

UntereFrequenz = [50 60 70 80 90 100];
ObereFrequenz = [200 210 220 230 240 250];

for i=1:length(UntereFrequenz) %( HIER PARFOR)
BandpassFilter = designfilt('bandpassfir', 'StopbandFrequency1', UntereFrequenz(i)-40, 'PassbandFrequency1', UntereFrequenz(i), 'PassbandFrequency2', ObereFrequenz(i), 'StopbandFrequency2', ObereFrequenz(i)+40, 'StopbandAttenuation1', 60, 'PassbandRipple', 1, 'StopbandAttenuation2', 60, 'SampleRate', 1000);
Agefiltert = filter(BandpassFilter,A);

for j=1:length(B)
bereich = Agefiltert(B(j):30);
Ergebnis(i,j) = sum(bereich);
end
end

In Wirklichkeit handelt es sich natürlich um andere Werte und Berechnungen, aber das hier ist die einfachste Möglichkeit alles darzustellen.

Da das Anwenden der Filter sehr lange dauert, würde ich das gern in einer parfor Schleife machen. Ich meine damit die erste for-Schleife.
Leider geht das nicht, da ich in der zweiten Schleife das Ergebnis mit den Parametern der ersten und zweiten Schleife schreibe.
Ich bekomme diese Fehlermeldung:
"Error: The variable Ergebnis in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview"."

Es ist mir klar, dass es daran liegt, wie ich das Ergebnis schreiben möchte. Aber ich kenne keine andere Möglichkeit, die mir es erlaubt parfor zu verwenden. Kann mir nitte jemand weiterhelfen? Ich hätte gerne einen Tipp, wie man es anders machen kann.

Vielen Dank schon mal!


Harald
Forum-Meister

Forum-Meister


Beiträge: 18.822
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 25.01.2018, 11:50     Titel:
  Antworten mit Zitat      
Hallo,

hier gibt es Tutorials dazu:
https://www.mathworks.com/videos/se.....ting-tutorials-97719.html
Hier hilft besonders Teil 4.

Oder auch ein kleiner Trick:
Code:
Ergebnis = zeros(length(UntereFrequenz), length(B));
parfor i=1:length(UntereFrequenz) %( HIER PARFOR)
    BandpassFilter = designfilt('bandpassfir', 'StopbandFrequency1', UntereFrequenz(i)-40, 'PassbandFrequency1', UntereFrequenz(i), 'PassbandFrequency2', ObereFrequenz(i), 'StopbandFrequency2', ObereFrequenz(i)+40, 'StopbandAttenuation1', 60, 'PassbandRipple', 1, 'StopbandAttenuation2', 60, 'SampleRate', 1000);
    Agefiltert = filter(BandpassFilter,A);
   
    tmp = zeros(1, length(B));
    for j=1:length(B)
        bereich = Agefiltert(B(j):30);
        tmp(j) = sum(bereich);
    end
    Ergebnis(i, :) = tmp;
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
rollmops94

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2018, 16:22     Titel:
  Antworten mit Zitat      
Vielen Dank!
Ich werde es sofort ausprobieren. Und das Video schaue ich mir auch an.

Das wird mir viel helfen!
 
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
.



goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.