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

for-Schleife vermeiden

 

Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.06.2008, 10:52     Titel: for-Schleife vermeiden
  Antworten mit Zitat      
Hallo, liebe Mitstreiter,

ich komme hier nicht weiter. Wie lässt sich diese for-Schleife vermeiden? F sei eine symmetrische Matrix. Was ich brauche ist die symmetrische Matrix a, die aus je zwei Spalten (oder Zeilen) von F das Maximum bestimmt, also
Code:
a(ind_i,ind_j) = max([F(ind_i,:),F(ind_j,:)]);

Geschafft habe ich bisher nur die Reduktion auf die untere Dreiecksmatrix (reicht, weil a symmetrisch ist). Die Diagonale ist leicht, weil nur über eine Spalte von F das Maximum gebildet werden muss. Aber der Rest müsste doch auch gehen, oder?

Gibt es zum Beispiel eine Funktion, die mir alle Zweierpärchen aus den Spalten von F bildet? Ich dachte schon an perms oder nchoosek, aber beide passen nicht richtig.

Code:
n = 10;
f=rand(n);
F=f+f';
a_help = max(F);
a = zeros(size(F));

for ind_i = 1:n
    for ind_j = 1:ind_i-1
        a(ind_i,ind_j) = max(a_help([ind_i,ind_j]));
    end
end
a = a + a' + diag(a_help);


Danke für jegliche Hilfe
Bijick
_________________

>> why

Zuletzt bearbeitet von Bijick am 20.06.2008, 15:26, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.320
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 20.06.2008, 12:31     Titel:
  Antworten mit Zitat      
Hi Bijick,

kannst Du
Code:
max_Zeilen=repmat(max(F,[],1),size(F,1),1);
max_Spalten=repmat(max(F,[],2),1,size(F,2));
a=max(max_Zeilen,max_Spalten)

gebrauchen?
Vielleicht könnte man mit NaN's hier noch die Symmetrie berücksichtigen.

Ansonsten kann man vielleicht noch sagen, dass nicht jede Schleife verteufelt werden muss, denn scheinbar leistet JIT bei deren Optimierung ganz gute Arbeit. Hatte dazu in der Matlab-Newsgroup mal eine Diskussion mit u.A. John D'Errico gelesen. Ich suche noch den Link.

Edit:
Ok, ab einer Größe von 1000x1000 sollte man doch auf die for-Schleife verzichten...
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2008, 12:52     Titel:
  Antworten mit Zitat      
Hallo,

ganz einfach geht das nicht, aber es geht schon (die Diagonale muss manuell hinzugefügt werden).

Code:

% Matrix Dimension (quadratisch)
N=10;

f = rand(N);
F = f+f';
F_max = max(F);

% Gibt alle Permutationen mit 2 Elementen ohne Wiederholungen aus, leider auch keine Diagonalelemente
ind = nchoosek(1:N,2);
% Umordnung der Indizes von 2-dim auf 1-dim
ind_n = (ind(:,1)-1)*N+ind(:,2);

% Matrix initialisieren
A = zeros(N,N);
% mit Maxima belegen
A(ind_n) = max(F_max(ind'));
% symmetrisch
A = A + A';
% Diagonale hinzu
A = A + diag(F_max);


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Themenstarter

Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.06.2008, 14:45     Titel:
  Antworten mit Zitat      
Hallo nschlange und dib0r,

das hört sich beides schon gut an. Ich probiere mal mit den Laufzeiten herum und berichte dann weiter. Meine Matrizen sind übrigens 800x800 bzw. 1024x1024 und mein Code war schleppend langsam.

Vielen Dank schon mal,

herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Bijick
Themenstarter

Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.06.2008, 15:25     Titel:
  Antworten mit Zitat      
Hallo Ihr zwei,

ich habe alles drei Codes daraufhin überprüft, ob sie dieselben Matrizen liefern und das war der Fall. Dann der Laufzeittest. Für kleine Matrizen (n = 6, n=10) waren die Codes von dib0r (nowak2.m) und mir (nowak.m) sehr schnell ("0 Sekunden"), während nschlanges Code etwas langsamer war (z.B. 0.3 Sekunden).

Bei der erforderlichen Größenordnung jedoch (n = 1000), sieht es ganz anders aus:

Code:
f=rand(1000);F=f+f';
% Mein Schleifen-Code
[x0,fmin,time]=nowak(F);time

time =

    3.5310

% nchoosek-Code von dib0r
[x0,fmin,time]=nowak2(F);time

time =

   12.9520

% repmat-Code von nschlange
[x0,fmin,time]=nowak3(F);time

time =

    0.2970


Das ist doch mal eindeutig. Also vielen Dank an Euch beide, ich war mit meinem Latein am Ende. Und sorry, dass der Code nicht lauffähig war, ich ändere es mal oben.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.