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

Matrix Doppelwerte ersetzen durch neu Werte

 

student__8898_
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 04.08.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2023, 09:17     Titel: Matrix Doppelwerte ersetzen durch neu Werte
  Antworten mit Zitat      
Wie kann ich dafür sorgen, dass meine Matrix Zufallszahlen von 1 bis 300 enthält, (quasi eine 30x10 Matrix) ohne dass die Zahlen doppelt vorkommen.

Weiß jemand vielleicht, wie ich dafür sorgen kann, dass die Matrix diese Dopplungen durch neue Werte ersetzt, die NICHT in der Matrix enthalten sind?


Aktuell sieht mein Matrix, wie folgt aus:
A=(randi(300,30,10))


Bin für alle Vorschläge dankbar Smile
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

hier bedeutet das ja, dass die Zahlen von 1 bis 300 in einer zufälligen Folge entsprechend angeordnet werden sollen:
Code:
M = reshape(randperm(300), 30, 10);


Wenn nicht alle Zahlen enthalten sein werden, kann man das zweite Argument von randperm nutzen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
student__8898_
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 04.08.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2023, 10:30     Titel:
  Antworten mit Zitat      
Vielen Dank Harald.

Das hat mir das mühsame Eintippen um einiges vereinfacht.

Ich hätte da noch eine Frage, und zwar, wie kann ich eine Matrix mit zufälligen Zahlen erzeugen, die ebenfalls nur einmal vorkommen, aber wo eine Spalte schon vordefiniert ist.

Quasi die Zahlen, die in der 2.Spalte sind, sollen berücksichtigt werden, sodass ausgehend von diesen Zahlen, die restlichen Spalten befüllt werden. D.h. Die anderen Spalten sollten weiterhin zufällig OHNE Dopplungen befüllt werden, ABER unter Berücksichtigung der Zahlen in Spalte 2.



Ganz einfach gesagt: Die Zahlen in Spalte 2 sollen in den anderen nicht erneut auftauchen.


Jetzt schonmal für alles VIELEN Dank Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ist wahrscheinlich machbar, aber ich verstehe das noch nicht ganz.
Ist Spalte 1 außen vor?

Eine Variante des bisherigen Ansatzes dürfte helfen, zusammen mit setdiff .

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
student__8898_
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 04.08.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2023, 14:17     Titel:
  Antworten mit Zitat      
Vielen Dank, der Ansatz mit reshape und randperm hat mir geholfen.

Leider habe ich das Problem, dass ich zwei verschiedene Matrizen habe und beide sind mit zufallszahlen von 1 bis 40 befüllt.

Ich möchte dafür sorgen, dass die Spalten der 2.Matrix mit unterschiedlichen Zahlen befüllt sind im Vergleich zu der 1.Matrix.


D.h. bspw. die Matrix hat in der 1.Spalte die Zahlen 3,4,5 dann sollen diese nicht in der 1.Spalte der 2.Matrix vorkommen, sondern in den restlichen Spalten.

Ich dachte, daran, dass man mithilfe der Funktion "reshape" die Zahlen der beiden Matrizen aussortieren kann, aber das geht am Ende nicht auf, da die Zahlen mit randperm zufallsbedingt befüllt sind und je nach Zufall die Anzahl der gleichen Zahlen sich ändern, wenn ich diese Funktion auf die anderen Spalten weitere fortsetze.


Vielen Dank jetzt schonmal Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.08.2023, 15:23     Titel:
  Antworten mit Zitat      
Hallo,

auch hier ist das Problem, dass mir die Frage noch nicht klar genug ist. Speziell: was sind denn die Dimension der beiden Matrizen?
Code ist zumindest für mich deutlich leichter verständlich als wortreiche Erklärungen.

Zudem habe ich das Gefühl, dass du dich stückweise zum eigentlichen Problem hinarbeitest. Das ist ein durchaus sinnvoller Ansatz, aber für mich ist es hilfreich, das eigentliche Problem auch zu kennen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
student__8898_
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 04.08.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2023, 15:38     Titel:
  Antworten mit Zitat      
Okay, also programmiert sieht mein Skript so aus:


A=reshape(randperm(40),4,10); %1.Matrix mit Zahlen von 1 bis 40
B=reshape(randperm(40),4,10); %2.Matrix

b(:,2)=A(:,1) %1.Spalte der 1.Matrix soll, gleich der 2.Spalte der 2.Matrix sein

BB_Matrix=setdiff(A,b)
BB_Matrix=reshape(BB_Matrix(ranperm(length(BB_Matrix))),4,10);

BB_Matrix(:,1)=BB_Matrix(:,1);
BB_Matrix(:,2)=b(:,2);

So mein Ziel ist es, herauszufinden, wie ich es hinbekomme, dass die restlichen Spalten der 2.Matrix(BB_Matrix), mit den Zahlen gefüllt wird unter Berücksichtigung, dass die Zahlen der folgenden Spalten nicht gleich den Zahlen aus der 1.Matrix sind.


D.h. ich möchte nicht, dass eine Zahl, die in der 2.Spalte in der 1.Matrix vorkommt auch in der 2.Spalte in der 2.Matrix vorkommt. Aber verstehe nicht, wie ich es hinbekommen kann, dass diese Zahl/Zahlen nicht auftaucht


Lieben Dank jetzt schonmal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.08.2023, 08:08     Titel:
  Antworten mit Zitat      
Hallo,

hier ein Vorschlag:
Code:
A=reshape(randperm(40),4,10); %1.Matrix mit Zahlen von 1 bis 40

B = zeros(size(A));
B(:,2)=A(:,1); %1.Spalte der 1.Matrix soll, gleich der 2.Spalte der 2.Matrix sein

cols = [1, 3:size(A,2)]; % alle Spalten außer der 2.
for k = cols
    alreadyUsed = reshape(B(:, 1:k-1), [], 1);         % in vorherigen Spalten verwendete Zahlen
    permitted = setdiff(1:40, [A(:,k); alreadyUsed]);  % für momentane Spalte erlaubte Zahlen
    selected = randperm(numel(permitted), size(A,1));  % zufällige Wahl, welche dieser Zahlen genommen werden
    B(:, k) = permitted(selected);
end


Wenn du in anderen Foren postest, verlinke das bitte. Ansonsten kann es sein, dass Leute sich in einem Forum noch mit einer Frage beschäftigen, die im anderen Forum bereits gelöst wurde, und das ist dann ja Zeitverschwendung.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.