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

Werte in struct NaN setzen

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2016, 11:03     Titel: Werte in struct NaN setzen
  Antworten mit Zitat      
Hallo zusammen,
ich habe eine kurze Frage. ich würde gerne bestimmte Wert in einem Feld meines structs NaN setzen. Ich hab schon mehrere Fragen gefunden, wie ich Werte einer Matrix NaN setze aber irgendwie nicht wirklich was zum Thema struct.
Angenommen ich möchte in der Test Datei alle Werte in Feld B die kleiner als -30 sind NaN setzen.
Ich dachte das mir eventuell folgendes weiterhilft, allerdings passiert da rein gar nichts.

Code:

for k = 1:length(Test)
    if any(Test(k).B <= -25)
        Test(k).B = NaN;
    end
end
 


Ich hoffe ich blamiere mich mit dieser Frage nicht allzu sehr, leider beschäftige ich mich noch nicht zu lange mit Matlab.
Freue mich auf Tips und Anregungen.

Test.mat
 Beschreibung:

Download
 Dateiname:  Test.mat
 Dateigröße:  9.95 KB
 Heruntergeladen:  353 mal


Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2016, 11:47     Titel:
  Antworten mit Zitat      
Ich hab es doch noch rausgefunden.
Code:

for k = 1:length(Test);
      x = Test(k,:).B(:,:);
      x(x<- 30) = NaN;
      Test(k,:).B(:,:) = x;
end
 


Jetzt würde ich gerne noch etwas machen und zwar, wenn ich mittels meines Codes zum Beispiel den Wert in B(1,1) gleich NaN gesetzt habe, das der Wert in A(1,1) auch NaN gesetzt wird, das gleich dann auch für alle anderen Werte die in B NaN sind. Ich habe folgende Frage gefunden, allerdings wird da die ganze Zeile gelöscht und nicht nur ein einzelner Wert, könnte man das irgendwie abwandeln?

http://www.gomatlab.de/viewtopic,p,157866.html#157866
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 25.01.2016, 11:48     Titel:
  Antworten mit Zitat      
ähm, ok, trotzdem hier meine Lösung zur 1.Frage Smile

Code:
load('Test.mat')
for k=1:length(Test)
    B=Test(k).B;
    for i=1:size(B,1)
        for j=1:size(B,2)
            if B(i,j)<=-25
                Test(k).B(i,j)=NaN;
            end
        end
    end
end


Gruß


Edit: 2. Frage würde dann so aussehen

Code:
load('Test.mat')
for k=1:length(Test)
    B=Test(k).B;
    for i=1:size(B,1)
        for j=1:size(B,2)
            if B(i,j)<=-25
                Test(k).B(i,j)=NaN;
                Test(k).A(i,j)=NaN;
            end
        end
    end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.01.2016, 12:00     Titel: Re: Werte in struct NaN setzen
  Antworten mit Zitat      
Hallo,

Der gezeigte Code setzt das Feld B auf den Wert NaN, wenn irgendein Element von B <= 25 ist. Falls B aber eine Matrix ist, wird "any(B <= -25)" ein Vektor. Und dann wird für die IF-Bedingung implizit ein all() eingefügt.

Das kannst du mit dem Debugger untersuchen. Setze in den IF-Zeile einen Breakpoint, starte den Code, teste, ob die Zeile überhaupt angesprungen wird. Und wenn Matlab dort stoppt, gib im Commandwindow ein:
Code:
any(Test(k).B <= -25)

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2016, 12:28     Titel:
  Antworten mit Zitat      
Hallo zusammen,

erstmal Danke für die Anregungen.

Friidayy dein Code klappt soweit eigentlich super, allerdings wollte ich fragen, ob man auch irgendwie die vielen Schleifen verhindern kann. Die Testdatei ist ja relativ klein, sobald ich mehr Felder hab müsste ich ja jedesmal eine neue Schleife dazupacken und das dauert ja dann immer länger.
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 25.01.2016, 13:03     Titel:
  Antworten mit Zitat      
Code:
load('Test.mat')
tic;
for k=1:length(Test)
    B=Test(k).B;
    for i=1:size(B,1)
        for j=1:size(B,2)
            if B(i,j)<=-25
                Test(k).B(i,j)=NaN;
                Test(k).A(i,j)=NaN;
            end
        end
    end
end
toc;

load('Test.mat')
tic;
for k=1:length(Test)
    tmpA=Test(k).A;
    tmpB=Test(k).B;
    idx=find(tmpB<=-25);
    tmpB(idx)=NaN;
    tmpA(idx)=NaN;
    Test(k).A=tmpA;
    Test(k).B=tmpB;
end
toc;

load('Test.mat')
tic;
for k=1:length(Test)
    idx=find(Test(k).B<=-25);
    Test(k).A(idx)=NaN;
    Test(k).B(idx)=NaN;    
end
toc;



Schau mal wie die Performance bei deinen großen Matrizen ist, Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.01.2016, 14:06     Titel:
  Antworten mit Zitat      
Hallo,

Und noch ein Tick schneller ohne FIND:

Code:
load('Test.mat')
tic;
for k=1:length(Test)
    idx = (Test(k).B<=-25);  % Ohne FIND
    Test(k).A(idx)=NaN;
    Test(k).B(idx)=NaN;    
end
toc;

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2016, 15:24     Titel:
  Antworten mit Zitat      
Vielen Dank ihr beiden, ihr habt mir wirklich weiter geholfen.
 
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 - 2025 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.