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

in schleife dünnbesetzteste Zeile finden

 

rwthlerI

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2018, 10:51     Titel: in schleife dünnbesetzteste Zeile finden
  Antworten mit Zitat      
Guten Morgen,

ich möchte eine Schleife haben, die mir alle 8 Zeilen meiner Matrix durchgeht und mit der beginnt, die die wenigsten Einträge ungleich null hat, aber auf jeden Fall einen Eintrag ungleich null hat. Ich habe es so versucht:

if sum(C(8,:))>0 && sum(C(8,:)~=0)== min(sum(C'~=0))

Das scheint aber nicht so richtig zu funktionieren.

Ich hoffe ihr könnt mir helfen.


Harald
Forum-Meister

Forum-Meister


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

wie wäre es damit:
Code:
nonzeros = sum(C ~= 0, 2); % Anzahl der von Null versch. Einträge pro Zeile
nonzeros (nonzeros == 0) = NaN; % Nullzeilen vernachlässigen
[num, idx] = min(nonzeros)


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2018, 11:16     Titel:
  Antworten mit Zitat      
Danke das sieht schon gut aus. Am besten zeige ich einmal meinen Code.
Code:

for n = 1:1:8                       %jede Zeile durchgehen
                                    %mit am wenigsten besetzter beginnen

if sum(C(8,:))>0 && sum(C(8,:)~=0)== min(sum(C'~=0)) %prüfen ob überhaupt besetzt und ob wenigste besetzt
                   
    [val,idx] = max(C(8,:));     %Maximum in Zeile 8 mit Index
    C(:,idx) =0;                 %Spalte in der das Maximum ist gleich null setzen
   
    if idx==1                     %Angabe, dass Arbeit(Spalte) durchgeführt wird
        r=1;
    elseif idx==2
        s=1;
    elseif idx==3
        t=1;
    else
        u=1;
    end
    C(8,:)=0;                      %Zeile zu null setzen
   
elseif sum(C(7,:))>0 && sum(C(7,:)~=0) == min(sum(C'~=0))
    [val,idx] = max(C(7,:));
    C(:,idx) = 0;
   
    if idx==1
        r=1;
    elseif idx==2
        s=1;
    elseif idx==3
        t=1;
    else
        u=1;
    end
    C(7,:)=0;
   
   
elseif sum(C(6,:))>0 && sum(C(6,:)~=0) == min(sum(C'~=0))
   
    [val,idx] = max(C(6,:));
    C(:,idx) = 0;
   
    if idx==1
        r=1;
    elseif idx==2
        s=1;
    elseif idx==3
        t=1;
    else
        u=1;
    end
    C(6,:)=0;
 

Der Code soll dazu dienen in jeder Zeile das Maximum zu finden und dann die Zeile und die Spalte in der der maximale Eintrag steht zu null setzen. r, s, t und u benutze ich dazu, um zu erkennen, dass jede Spalte zu null gesetzt wurde. Ist also das Maximum der Zeile in der vierten Spalte, wird u = 1 gesetzt.
Nach der for-Schleife wird geprüft, ob die Summe aus r+s+t+u=4 ist. Ist das nicht der Fall, gibt er einen Fehler aus
 
Harald
Forum-Meister

Forum-Meister


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

und, funktioniert der Code? Wenn nicht, welche konkreten Probleme gibt es dabei?

Hilfreich wäre auch ein konkretes Beispiel, was du genau erreichen möchtest. Eine 4x4-Matrix sollte reichen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2018, 15:54     Titel:
  Antworten mit Zitat      
Ich möchte dass meine matrix so sortiert wird, dass die Zeile mit den wenigsten Einträgen ganz unten steht und die mit den meisten oben.
Zum Beispiel :
0 2 3 4.
1 2 3 4.
0 0 3 4
0 0 0 0
Soll werden zu:
1 2 3 4
0 2 3 4
0 0 3 4
0 0 0 0

Ich habe es mit sortrows versucht aber damit gibt es bei einer Null Zeile Probleme.
Ich hoffe das hilft dir weiter.
 
Harald
Forum-Meister

Forum-Meister


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

das ginge so:
Code:
nonzeros = sum(A ~= 0, 2)
[~, seq] = sort(nonzeros, 'descend')
A(seq, :)


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