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

Alle kleinere Vektoren finden

 

frz3
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 21.01.12
Wohnort: Lindau
Version: ---
     Beitrag Verfasst am: 29.01.2012, 18:27     Titel: Alle kleinere Vektoren finden
  Antworten mit Zitat      
Hallo,

ich bin gerade dabei, einen Code zu schreiben, der für einer Menge von Vektoren (n-dimensional) zählt, wieviele Vektoren kleiner als ein bestimmter Vekor sind.
Die Vektoren sind alle spaltenweise in der Matrix A gespeichert.
Dabei soll für jeden Vektor angezeigt werden, wieviele Vektoren kleiner sind.

Ein Vektor ist kleiner als der andere Vektor, wenn alle n Komponenten des Vektors kleiner sind.
Ich möchte, dass em ende dann angzeiegt wird, dass z.B. der Vektor A(:,x) von 8 Vektoren unterbiten wird und der Vektor A(:,y) beispielsweise von 20 Vektoren.

Ich hab leider keine Ahnung wie ich das machen kann.
Wie kann ich kann ich das schreiben, dass wirklich auch ALLE n Komponenten des Vektors kleiner sind. Ich hab mit dem Code unten ein Anfang gemacht. Doch leider ist auch der Anfang nicht ganz korrekt, da hierbei nicht darauf geachtet wird, dass ALLE Komponenten eines Vekotrs kleiner sein müssen.

Könnte mir jemand helfen?
DANKE! Smile

Code:

zaehler(:,i)+1   %zaehler soll mir angeben wie oft der jeweilige Vektor unterboten wird
for i=1:anzVektoren
   for k=1:anzVektoren
   if A(:,i)<=A(;,k) & i~=k
      zaehler(:,i)=zaehler(:,i)+1
   end
   end
end
 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.01.2012, 20:16     Titel:
  Antworten mit Zitat      
Hallo,

probiers mal so:

Code:
zaehler = zeros(1, anzVektoren);
for I=1:anzVektoren
zaehler(I) = nnz( bsxfun(@lt, A(:, [1:I-1 I+1:end]), A(:, I)));
end


Grüße,
Harald
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: 30.01.2012, 11:17     Titel: Re: Alle kleinere Vektoren finden
  Antworten mit Zitat      
Hallo frz3,

Wenn man die Matrix mit SORTROWS sortiert bestimmt die Position einer Zeile gleichzeitig die Anzahl der Zeilen, bei denen alle Elemente kleiner sind. Nun benötigt man noch den 2. Output von SORTROWS um die Korrelation zur orginalen Reihenfolge herzustellen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
frz3
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 21.01.12
Wohnort: Lindau
Version: ---
     Beitrag Verfasst am: 30.01.2012, 15:45     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

probiers mal so:

Code:
zaehler = zeros(1, anzVektoren);
for I=1:anzVektoren
zaehler(I) = nnz( bsxfun(@lt, A(:, [1:I-1 I+1:end]), A(:, I)));
end


Grüße,
Harald



Danke Harald!
Der Code ist eigentlich richtig. Doch das Problem ist nur , dass er z.B. bei der Matrix
Code:
A =

    20    15    23    45    10  
    30    10    20    50    12  


für die erste Spalte beispielsweise für "zaehler" 5 rausgibt, weil die 20 zweimal (von 15 und 10) und die 30 dreimal (von 10, 20 und 12) unterboten wird.
Ich will aber, dass er da für "zaehler" 2 rausgibt. Da hier die erste Spalte nur von der 2. und 5. Spalte unterboten wird.

Könntest du mir noch dabei helfen?
Wäre Dir wirklich sehr dankbar! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.01.2012, 20:25     Titel:
  Antworten mit Zitat      
Hallo,

angepasste Zeile:

Code:
zaehler(I) = sum(all(( bsxfun(@lt, A(:, [1:I-1 I+1:end]), A(:, I)))));

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 21.01.12
Wohnort: Lindau
Version: ---
     Beitrag Verfasst am: 02.02.2012, 23:47     Titel:
  Antworten mit Zitat      
Danke Harald!
Ich hab nun eine weitere doofe Frage.
Der Code hat genauso funktioniert wie ich es wollte.

Code:
zaehler = zeros(1, anzVektoren);
for I=1:anzVektoren
zaehler(I) = sum(all(( bsxfun(@lt, A(:, [1:I-1 I+1:end]), A(:, I)))));
end


Das Problem ist eigentlich, dass die Vektoren alle zweidimensional sind und alle in der Matrix gespeichert sind.
In etwa so:
Code:
A =

   33.5484   16.9372   33.4060   65.8052   26.0413   nan
   92.8923   76.7551    2.4829    2.3191    90.6820   nan
   12.5121   3             80.4143   85.6333   33.1039   33.8863
   78.8334   5             72.3049   19.4385   18.3034   47.8458
   33.3321   54.1842   3.4         26.9378    nan         nan
   12.2285   59.2448   4            18.7553    nan         nan
   54.8519   26.7871   81.2965   53.8918   57.3252   61.9360
   64.7729   49.5832   68.8332   51.8262   63.9341    9.9446
   


Wie kann ich erreichen, dass z.B. der Vektor
Code:
33.5484
92.8923

mit ALLEN Vektoren der Matrix verglichen wird. Also beispielsweise auch mit dem Vektor [3;5], der nicht in der selben Zeile liegt.

Ich dachte damals ich krieg das selber hin, wenn du mir bisschen auf die Sprünge hilfst. Aber leider kann ich deinen Code nicht umschreiben, damit er zeilenübergreifend vergleicht.
Vom Prinzip her stimmt dein Code.
Vermutlich muss nur der Teil
Code:
A(:, [1:I-1 I+1:end])
geändert werden. Ich weiß aber nicht wie Sad
Wäre Dir unendlich dankbar, wenn du mir wieder aushelfen könntest!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Code:
B = repmat(A, 2, []);


dann den obigen Code auf B anwenden. Das Resultat dann ggf. mit repmat wieder zurücktransformieren.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 21.01.12
Wohnort: Lindau
Version: ---
     Beitrag Verfasst am: 03.02.2012, 10:37     Titel:
  Antworten mit Zitat      
Hallo Harald,

Code:
anzVektoren= 6;
B = repmat(A, 2, []);
zaehler = zeros(1, anzVektoren);
for I=1:anzVektoren
zaehler(I) = sum(all(( bsxfun(@lt, B(1:2, [1:I-1 I+1:end]), B(1:2, I)))));
end


Funktioniert leider nicht!

Was solll mir das nützen, wenn ich mit
Code:
B = repmat(A, 2, []);
die Matrix übereinander kopiere.
Das führt nämlich auch nicht dazu, dass ein Vektor auch mit den Vektoren verglichen wird, die sich nicht in seiner Zeile befinden.

Danke! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.02.2012, 16:01     Titel:
  Antworten mit Zitat      
Hallo,

Sorry, ich meinte jeweils RESHAPE statt repmat.

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

Forum-Meister


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

da nochmal die Nachfrage kam: insgesamt dann so:

Code:

AnzahlEintraege = 2;
B = reshape(A, AnzahlEintraege , []);
anzVektoren= size(B,2);
zaehler = zeros(1, anzVektoren);
for I=1:anzVektoren
zaehler(I) = sum(all(( bsxfun(@lt, B(1:2, [1:I-1 I+1:end]), B(1:2, I)))));
end
zaehler = reshape(zaehler, size(A,1)/AnzahlEintraege , size(A,2))
 

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 21.01.12
Wohnort: Lindau
Version: ---
     Beitrag Verfasst am: 23.03.2012, 23:53     Titel:
  Antworten mit Zitat      
Gibt es noch eine Möglichkeit, wenn ein Eintrag von B(1:2, I) "nan" ist, dass dann in der Matrix "zaehler" dafür keine 0 eingegeben wird, sondern ein "nan",
weil es ist sowieso klar, dass keine Zahl kleiner als "nan" sein kann?

Weil zum jetzigen Stand werden auch die "nan" Einträge der Matrix A mit den anderen Werten verglichen und dann logischerweise "0" rausgegeben, da kein Eintrag kleiner als 0 sein kann. Mir wäre es leiber, wenn er in solchen Fällen "nan" ausgibt statt "0".

Gruß frz3
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

vor der letzten Zeile folgendes einfügen:

Code:
zaehler(any(isnan(B))) = NaN;


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 - 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.