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

Ich brauch Hilfe beim Vektorisieren

 

Lambok

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2017, 10:49     Titel: Ich brauch Hilfe beim Vektorisieren
  Antworten mit Zitat      
Hallo, ich möchte diese for Schleife bezüglich der erstellten Matrix gerne vektorisieren.Ich habe schon einige Sachen versucht, brauche am Schluss aber immer mindestens eine for-Schleife...
Kann mir jemand helfen?
Der Vektor M soll später mehrere Millionen stellen haben und deshalb brauche ich die Vektorisierung.
Vielen Dank schonmal!

Code:

M=zeros(1,30);
M([5:10 20:25])=50;
M([1:2 13:18])=75;
idx=M<0.01;
 for k=2:1:length(M)
     
     if idx(k)>0.001
         M(k)=M(k-1);
     end
 end


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 12.05.2017, 16:59     Titel:
  Antworten mit Zitat      
Hi,

Mit
Code:
anfang  = strfind([0, idx, 0], [0 1])
ende    = strfind([0, idx, 0], [1 0]) - 1

kannst du die Start- und Endindizes der Werte <0,01 finden. Damit dürfte sich das lösen lassen. Falls es nicht klappt, meld dich noch mal. Muss jetzt los.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Lambok

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2017, 17:14     Titel:
  Antworten mit Zitat      
Hallo Seban,
Vielen Dank für die Antwort, das hilft schonmal. Jedoch komm ich nicht darauf, wie ich jetzt die Werte zwischen Anfangs und Endwert ohne eine Schleife sinnvoll auffüllen kann.
Wahrscheinlich ist das sehr einfach, aber ich bin ein relativer Matlabanfänger.
Für weitere Hilfe wäre ich äußerst Dankbar Smile
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 16.05.2017, 18:54     Titel:
  Antworten mit Zitat      
Hallo Lambok,

Muss gestehen, ich komme auch nicht drauf Embarassed

Man kann aber zumindest das Durchlaufen des gesamten Arrays M umgehen:

Code:
M=zeros(1,30);
M([5:10 20:25])=50;
M([1:2 13:18])=75;
idx=M<0.01;

anfang      = strfind([0, idx, 0], [0 1]);
ende        = strfind([0, idx, 0], [1 0]) - 1;
neue_werte  = M(anfang-1);

for k = 1:size(neue_werte, 2)
    M(anfang(k):ende(k)) = neue_werte(k);
end



Anfangs- und Endvektoren kann man auch folgendermaßen bestimmen:
Code:
anfang = find(diff([false, idx]) == 1);
ende   = find(diff([idx, false]) == -1);

Vielleicht ist das für drölfmillionen Werte schneller (kannst du mit tic toc testen). Zu beachten ist, dass unterschiedliche Fälle möglich sein könnten: Befinden sich am Anfang und/oder Ende von M Nullen oder nicht.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Lambok

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.05.2017, 10:48     Titel:
  Antworten mit Zitat      
Hallo Seban, ich danke dir für die ideen, habe nach langem hin und her einen Weg gefunden, mit dem ich ganz gut leben kann. Hier für dich meine Lösung Smile

Code:
m=zeros(1,30);
t=1:1:length(m);
m([5 26])=50;
m(3)=75;
m(13)=120;
m(24)=105;
idxBT=find(m);              % Index aller validen Temperaturen  
m(1)=m(idxBT(1));           % erste Temperatur wird auf aller erste 0 geshrieben
m(end)=m(idxBT(end));       % erste valide Temperatur wird auf letzten Wert im feld geschrieben
idxBT2=[1 idxBT length(m)]; % Indexvektor um ersten und letzten Wert ergänzen

m=interp1(t(idxBT2),m(idxBT2),t,'previous'); % interpolation mit vorherigem validen Wert
 
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.