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

Ersten gültigen Wert in Matrix finden

 

bestmedia
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 05.11.2013, 21:51     Titel: Ersten gültigen Wert in Matrix finden
  Antworten mit Zitat      
Hallo,
ich habe eine m x n -Matrix. Ungefähr so (nur größer):
NaN NaN NaN NaN NaN
NaN NaN NaN Zahl NaN
NaN Zahl Zahl NaN NaN
NaN Zahl NaN NaN NaN
Zahl Zahl NaN NaN NaN

Ich möchte nun in Jeder Spalte die Zeilennummer wissen, in der zum ersten Mal eine Zahl steht.

Ich hab mir folgendes gedacht:
Code:

r=[];
for n=1:attr.cn_width  % attr.cn_width=Spaltenanzahl der Matrix e
    for m=1:attr.cn_height %attr.cn_height=Zeilenanzahl der Matrix e
        if isnumeric(e(m,n))  %e ist die Matrix
            r=[r m];
            break  % Wenn das erste Mal eine Zahl gefunden wurde soll
                       %nächste Spalte angefangen werden
        end
    end
end
 


das Ergebnis sollte dann so aussehen (Bsp. von oben)
r= 5 3 3 2

Hat jemand ne Idee??

Danke,
Marco
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 05.11.2013, 22:21     Titel:
  Antworten mit Zitat      
Hallo,

damit deine Lösung funktioniert, brauchst du statt isnumeric(e(m,n)) wohl nur ein ~isnan(e(m,n)).

Falls deine Matrix e aber sehr groß ist, kannst du auch noch geschickter vorgehen.

Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
bestmedia
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 06.11.2013, 09:58     Titel:
  Antworten mit Zitat      
Hallo Nras,
ich habe den Code jetzt so geändert:
Code:

for n=1:attr.cn_width
    for m=1:attr.cn_height
        if isnan(e(m,n))
           %mach nichts
        else
            r(n,1)=m; %Wenn gültiger Wert gefunden, dann merken
            m=attr.cn_height; %Wenn gültiger Wert gefunden, dann nächste Spalte
        end
    end
end
 


funktioniert auch soweit ganz gut! Meine Matrizen sind maximal 1000x1000. Ist das in Matlabgrößen schon eine "große" Matrix? Smile

Du meintest, dass es wohl auch effektiver geht?

Grüße
Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 06.11.2013, 12:39     Titel:
  Antworten mit Zitat      
Hallo,

das kommt nur drauf an, ob du das Gefühl hast, dass du auf die Ergebnisse warten musst, ober ob sie sofort da sind. Man kann bei der doppelten for-Schleife noch was machen, das vermutlich Zeit einspart. Vor allem, wenn die ersten gültigen Werte (nicht NaNs) öfters erst in den unteren Zeilen stehen. Aber die Zeit, die für das Umschreiben drauf geht, muss man erst mal wieder durch diesen vermeintlichen Zeitgewinn reinholen Smile.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
bestmedia
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 06.11.2013, 12:48     Titel:
  Antworten mit Zitat      
Ok, dann kann ich es so lassen. Die Ergebnisse sind sofort da und und meist sind die gültigen werte in der oberen Hälfte anzutreffen Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.11.2013, 13:03     Titel:
  Antworten mit Zitat      
Hallo


eine Verbesserung, nutze BREAK wenn du denn Inneren Schleifendurchlauf abbrechen möchtest. Manipulation der Indizien bringt in dem Fall nichts

Code:

for n=1:attr.cn_width
    for m=1:attr.cn_height
        if isnan(e(m,n))
           %mach nichts
        else
            r(n,1)=m; %Wenn gültiger Wert gefunden, dann merken
            break; %Wenn gültiger Wert gefunden, dann nächste Spalte
        end
    end
end
 
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 06.11.2013, 13:06     Titel:
  Antworten mit Zitat      
Es hätte übrigens auch gereicht, einfach wiorklich nur das isnumeric() durch ein ~isnan zu ersetzen. Das spart den else-Teil. Aber deine Lösung sollte auch klappen.
Code:
r=[];
for n=1:attr.cn_width  % attr.cn_width=Spaltenanzahl der Matrix e
    for m=1:attr.cn_height %attr.cn_height=Zeilenanzahl der Matrix e
        if ~isnan(e(m,n))  %e ist die Matrix
            r=[r m];
            break  % Wenn das erste Mal eine Zahl gefunden wurde soll
                       %nächste Spalte angefangen werden
        end
    end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.11.2013, 13:11     Titel:
  Antworten mit Zitat      
Hallo

ohne Schleifen:

Code:


A =[
   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN     1   NaN
   NaN     1     1   NaN   NaN
   NaN     1   NaN   NaN   NaN
     1     1   NaN   NaN   NaN]


[r, c] = find(~isnan(A) & cumsum(~isnan(A),1)==1)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
bestmedia
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 72
Anmeldedatum: 02.04.11
Wohnort: Jena
Version: ---
     Beitrag Verfasst am: 06.11.2013, 15:13     Titel:
  Antworten mit Zitat      
auch eine schöne Lösung, vielen Dank.
Ist so ein "Einzeiler" eine saubere Lösung? Oder kann man durchaus geschachtelte Schleifen verwenden?

Grüße
Marco
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 - 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.