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

Maximalwerte einer Matrix

 

Chrisch
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2008, 14:58     Titel: Maximalwerte einer Matrix
  Antworten mit Zitat      
Hallo,

ich habe denke ich ein sehr einfaches Problem.
Ich initialisiere eine Matrix(n x n) mit Zufallswerten,
und möchte unter Beibehaltung der Matrix-Form nur noch die Maxima in
jeder Zeile stehen haben. Der Rest soll mit 0 gefüllt werden.
Über die Forumsuche hab ich nichts passendes gefunden.

Kann ich das über Indizes machen ?



N=input('Wähle die Feldgröße von min 4(<4 beendet: ')

if (N > 3)

B=rand(N,N)

[m,n]=max(B)

else
N=0
end;

pause;


Vielen Dank !
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 09.06.2008, 15:13     Titel:
  Antworten mit Zitat      
Moin Chrisch,

folgendes ist mir spontan eingefallen:
Code:

% [...]
B=rand(N,N);

[m,n]=max(B,[],2);

for k=1:length(m)
    C(k,n(k)) = m(k);
end

% [...]
 


Gruß
Alex

PS: Gibt es dafür auch eine Möglichkeit ohne for-Schleife auszukommen?
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 09.06.2008, 17:50     Titel:
  Antworten mit Zitat      
Wie waere es damit?
Code:
B(~max(B)) = 0;


Damit sollten alle Elemente die ungleich dem Maximum von B sind (und damit kleiner als das Maximum) gleich Null gesetzt werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.320
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 09.06.2008, 18:38     Titel:
  Antworten mit Zitat      
keloid hat Folgendes geschrieben:
Wie waere es damit?
Code:
B(~max(B)) = 0;


Damit sollten alle Elemente die ungleich dem Maximum von B sind (und damit kleiner als das Maximum) gleich Null gesetzt werden.


fast,

hier zwei Ideen:

Code:

clear all;
clc;
N=10;
A=rand(N)
B=A;

A(A~=repmat(max(A),size(A,1),1))=0

[val,ind]=max(B);
ind=ind+(0:1:size(B,1)-1)*size(B,1);
mask=logical(ones(size(B)));
mask(ind)=0;
B(mask)=0

_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Chrisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2008, 18:50     Titel:
  Antworten mit Zitat      
Vielen Dank ! Das sind sehr gute Ideen!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 09.06.2008, 20:14     Titel:
  Antworten mit Zitat      
es gibt sogar noch 2, etwas ähnlich der Vorgehensweise von nschlange

über Indizes, wenn man weiß, dass man auf Matrix Elemente nicht nur A(i,j), sondern A(i+j*n-n) zugreifen darf.

Code:

n                = 10;
m                = 10;
B                = rand(n,m);
pos_inB          = 1:n*m;

[maxEl,posMax]            = max(B,[],2);
posDel           = (1:n)'+posMax*n-n;
pos_inB(posDel)  = [];
B(pos_inB')       = 0;
 



Durch Erzeugen einer matrix durch multiplikation von 2 Vektoren
Spaltenvektor(n,1) *Zeilenvektor(1,m)=Matrix(n,m)
Code:

n                = 10;
m                = 10;
B                = rand(n,m);
[maxEl,posMax]            = max(B,[],2);
B(B~=(maxEl* ones(1,m)))=0
 
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 10.06.2008, 08:29     Titel:
  Antworten mit Zitat      
Die Beispiele von nschlange muessen noch etwas umgearbeitet werden, da sie im Moment die Spaltenmaxima beibehalten, das nur der Vollstaendigkeit halber.

Code:
A(A~=repmat(max(A,[],2),1,size(A,2)))=0

[val,ind]=max(B,[],2);
ind=ind+((0:1:size(B,1)-1)*size(B,1))';
mask=logical(ones(size(B)));
mask(ind)=0;
B=B';
B(mask)=0;
B=B'
 

Das muesste fuer die Zeilenmaxima funktionieren.
Es gibt sicherlich ne elegantere Moeglichkeit, als die Matrix zwei mal zu transponieren, aber mir fiel schlichtweg keine sinnvolle ein.
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2008, 22:20     Titel:
  Antworten mit Zitat      
Vielen Dank. Ich bin nun ein ganzes Stück weiter gekommen.
Mein nächstes Problem, womit ich heute den ganzen Tag zgebracht habe :

Ich habe nun eine Matrix C (N x N), die eine zufällige Verteilung von Einsen enthält.

C =

0 1 1 1
0 0 0 0
0 0 0 0
1 0 0 0

Ich möchte nun, sobald auf einer Zeile/ Spalte/ Diagonalen sich mehr als eine 1 befindet, in einem anderen Vektor R die "Kollisionen" der Einsen zählen lassen.
Die Indizes der C-Matrix laufen spaltenweise und so soll auch in R sortiert werden : die erste 1 in Spalte1, Zeile 3 soll der erste Eintrag in R sein usw.

Befinden sich z.B. 3 Einsen in einer Reihe, hat die mittlere Eins natürlich zwei Kollisionen (einmal nach links, einmal nach rechts).
Probleme hab ich vorallem mit den (Neben-)Diagonalen ..
Zeilen und Spalten funktioneren soweit.

R würde in diesem Beispiel so aussehen :
R=(1 1 2 2)

Hier ein Auszug meiner Idee :

[...]
[m,n]=find(C>0); %Zeile und Spalte meiner Einsen

for i=1:N %bestimme Index meiner Einsen
o=find(C,i);
end;

"Bestimme welche 1 kollidiert (die erste, zweite, dritte ..) und trage die Anzahl der Kollision in einem Vektor R an der (ersten, zweiten, dritten ..) Stelle ein."



Falls ihr meinen kompletten Quelltext sehen wollt, dann Bescheid sagen.
Wollte nur nich gleich alles hier vollmüllen.

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