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 einer Matrix Zahlen durch zufällige Zahlen ersetzten. .

 

Schiroko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2008, 17:39     Titel: In einer Matrix Zahlen durch zufällige Zahlen ersetzten. .
  Antworten mit Zitat      
Heyho,

freut mich, dass es eine ML Community gibt und man hier auch als Gast was schreiben darf : )


Ich würde gerne folgendes machen können:

ich gebe eine Matrix ein z.B. A = [2,6;7,2] und Matlab ersetzt jede 2 die er in der Matrix findet mit einer zufälligen Zahl.
(Idealerweise sollte diese ganz sein, ist das möglich? Habe gelesen ML könne keine ganzen Zahlen "ausspucken" : (

Hätte jemand eine Idee?


Vielen vielen Dank schonmal,
viele Grüße,
Schiroko


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 19.11.2008, 18:36     Titel:
  Antworten mit Zitat      
Hallo Schiroko,

herzlich willkommen. Smile

Mein Vorschlag (ganze Zufallszahl zwischen 0 und 100):

Code:
A(A==2) = round(rand(1,length(A==2))*100);


Bei Bedarf erklär ich es auch gern.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Schiroko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2008, 23:22     Titel: Dankeschön
  Antworten mit Zitat      
Heyho, vielen Dank für die schnelle Antwort und das herzliche Wilkommen : )

Nach einigem Rumexperementieren würd ich doch noch gerne mehr erfarhen : )

Über eine kleine Erklärung würde ich mich freuen, hab bisschen rumversucht,
und gesehen, es klappt zwar mit anderen Zahlen und auch mit Zahlen zwischen 0-10 statt 0-100, aber es klappt nicht bei anderen Matrix größen (3*3, 4*4 . . . oder grad erst festgestellt, als ich am Ende des Posts war, es geht mit garkeiner anderen Matrix z.B. A=[2,2;2,2] : (
(ML schreibt: ??? In an assignment A(I) = B, the number of elements in B and
I must be the same.)

Desweiteren wollte ich machen, dass er anstelle A zu überschreiben eine neue Matrix B macht, aber das hat auch nicht geklappt, egal wo hin ich "=B/B=" gesetzt hab. Was müsste ich dafür schreiben?


Ich weiss, ich will viel Wissen^^ ; )
schonmal aber vielen vielen Dank!!
Viele müde Grüße
Schiroko
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.11.2008, 11:31     Titel:
  Antworten mit Zitat      
Hallo Schiroko,

probier mal dies:

Code:
A(A==2) = round(rand(length(find(A==2)),1)*10);


Das müsste auch für andere Matrizen gehen. Ich hatte meine erste Version zu wenig getestet.

Zum Verständinis:

Code:
% Bestimme, wo A==2 gilt
f = find(A==2)
% Bestimme die Anzahl der Fundstellen
n = length(f)
% für diese Zahlen brauche ich Zufallszahlen zum Ersetzen.
r = rand(1,n)
% Da die Zahlen nur zwischen 0 und 1 liegen, muss man sie erhöhen
r2 = r*10
% Da die Zahlen ganz sein sollen, muss man sie runden
r3 = round(r2)
% Wo sollen die Zufallszahlen hin? An alle Positionen in A, wo die
% Abfrage A==2? den logischen Wert true liefert
A(A==2) = r3


Wenn man jeweils die Variablen in der nächsten Zeile ersetzt, kommt man zu dem Einzeiler oben.

Für eine Matrix B brauche ich zwei Zeilen oder muss es ganz anders machen:

Code:
B=A;
B(A==2) = round(rand(length(find(A==2)),1)*10)
% oder
B = A.*(A~=2) + (A==2).*round(rand(size(A))*10)


Herzliche Grüße
Bijick

PS: Warum hat es bei der Beispielmatrix trotz Fehler geklappt? Weil zufällig die Anzahl der Zweien gleich der Anzahl der Zeilen war.
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Schiroko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2008, 21:18     Titel: Danke
  Antworten mit Zitat      
Heyho,

mal wieder herzlichen Dank, diesmal funzt es wirklich perfekt : )

Soweit habe ich auch schon das hinbekommen, was ich damit vorhatte : ) nur eine Kleinigkeit noch nicht.

Und zwar kommt deine Zeile bei mir in einer While-Schleife vor als Befehlssequenz wenn X nicht eintrifft. Jetzt würde ich gerne aber, dass die While-Schleife solange weitermacht bis X Y Z ect ect nicht eintreffen.

Hab versucht die zwei Ungleichungen (später sollens viel mehr werden) die nicht eintretten dürfen, vorher darf die While-Schleife nicht enden mit einem "&", "&&", "and" zu verbinden, aber ich krieg immer eine Fehlermeldung : (
Und ein Freund von mir hat gesagt, man könne max. zwei "und"-Befehle pro Zeile einbauen?!


Mal wieder herzlichen Dank, wenn ich dann fertig bin, präsentier ich natürlich woran ich gebasstelt habe ^^

Herzliche Grüße
Schiroko
 
Schiroko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2008, 01:51     Titel: : )
  Antworten mit Zitat      
Guten Abend^^ mein Ergeiz hat sich nicht mit abfinden lassen, zu warten bis du schreibst und hat weiterversucht ^^ und wenn ich mich nicht irre, dann funktioniert while blablabla && blablba aber man muss Klammern um jeds blabla setzten : ) juhu : )

Dann wohl meine letzte Frage, wie krieg ich das alles was ich jetzt mir zurechtgebastelt habe in eine Art Miniporgramm. Sprich das zuerst die MAtrix eingegeben wird und dann das Ergebnis rausflopt, und nicht noch der Befehl nach der Eingabe der Matrix eingetippt werden muss?


Müde aber sehr zufriedene Grüße^^
Schiroko
 
Schiroko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2008, 02:20     Titel: -.- '
  Antworten mit Zitat      
Ahhhhhhhhh... wie demütigend. . . hat sich rausgestellt das war nur ein Zufall mit den beiden "&&" die sorgen anscheint doch nur dafür, das eins von beiden Bedinungen nicht eintrifft, nicht beide gleichzeitig : (

Dann hätte ich gern doch gewusst, was ein ganz normales "und" ist : (

So dass while blablablabla~=20 "und" blabla~=10 mach diesunddas.


*müde und diesmal unzufrieden* : (
 
Schiroko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2008, 02:22     Titel: : )
  Antworten mit Zitat      
Ich glaube ich sollte mich anmelden, dann könnte ich meine Monologe in einem Post abhalten^^

ist die Antwort auf meinen letzten Post "||" wenn ja einfach den letzten Post ignorieren : ) - das Glück ist mir hold : )
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2008, 11:42     Titel:
  Antworten mit Zitat      
Hallo,

könntest du mal einen kleinen Beispielcode posten?

Grundsätzlich gilt dass du soviele "AND" und "OR" verknüpfen kannst, wie du willst. Ob das nun eine while oder if Abfrage ist, ist eigentlich egal. Klammern brauchst du in MATLAB nicht zwingend falls alle Bedingungen gleichwertig sind, du kannst sie aber gern setzen (erhöht manchmal die Lesbarkeit).
Code:
x = 0;
y = 0;
z = 0;
A = rand (10, 11, 12);
while x<size(A,1) && y<size(A,2) && z<size(A,3)
  x=x+1;
  y=y+1;
  z=z+1;
  [x y z]
end

Der Unterschied zwischen "&" und "&&" ist dass && nur auf skalare Vergleichsoperatoren angewandt werden kann, & führt den Vergleich für jedes Element von Vektoren / Matrizen durch. Falls die Bedingung für alle Elemente gilt, wird die Anweisung ausgeführt - ein einziges Mal.
Code:
x = [0 1 2 3];
y = [1 1 1 1];
if x>0 & y>0
  disp('Alle Elemente > 0?');
else
  disp('Mindestens ein Element nicht > 0');
end


if x>-1 & y>-1
  disp('Alle Elemente > -1?');
else
  disp('Mindestens ein Element nicht > -1');
end


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Schiroko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2008, 15:09     Titel: Bsp.
  Antworten mit Zitat      
Heyho,

mal wieder vielen Dank für die ausführliche Antwort!!

Wenn du raussiehst, was ich versucht hab zu machen, bitte bitte nicht ausschreiben, googlechen soll das nicht finden, sonst heißt es, da wo ichs abgeb, ich hab hier abgeschrieben, auch wenn ich in wirklichkeit der Poster war^^

while

(B(1,1)+ B(1,2)+ B(1,3)+ B(1,4)+ B(1,5)+ B(1,6)+ B(1,7)+ B(1,Cool+ B(1,9) ~= 45) || (B(2,1)+ B(2,2)+ B(2,3)+ B(2,4)+ B(2,5)+ B(2,6)+ B(2,7)+ B(2,Cool+ B(2,9) ~= 45) || (B(3,1)+ B(3,2)+ B(3,3)+ B(3,4)+ B(3,5)+ B(3,6)+ B(3,7)+ B(3,Cool+ B(3,9) ~= 45) || (B(1,1)+ B(2,1)+ B(3,1)+ B(4,1)+ B(5,1)+ B(6,1)+ B(7,1)+ B(8,1)+ B(9,1) ~= 45) || (B(1,2)+ B(2,2)+ B(3,2)+ B(4,2)+ B(5,2)+ B(6,2)+ B(7,2)+ B(8,2)+ B(9,2) ~= 45) || (B(1,3)+ B(2,3)+ B(3,3)+ B(4,3)+ B(5,3)+ B(6,3)+ B(7,3)+ B(8,3)+ B(9,3) ~= 45) || (B(1,1)+ B(1,2)+ B(1,3)+ B(2,1)+ B(2,2)+ B(2,3)+ B(3,1)+ B(3,2)+ B(3,3) ~= 45) || (B(4,1)+ B(4,2)+ B(4,3)+ B(5,1)+ B(5,2)+ B(5,3)+ B(6,1)+ B(6,2)+ B(6,3) ~= 45) || (B(7,1)+ B(7,2)+ B(7,3)+ B(8,1)+ B(8,2)+ B(8,3)+ B(9,1)+ B(9,2)+ B(9,3) ~= 45) || (B(1,4)+ B(1,5)+ B(1,6)+ B(2,4)+ B(2,5)+ B(2,6)+ B(3,4)+ B(3,5)+ B(3,6) ~= 45) || (B(1,7)+ B(1,Cool+ B(1,9)+ B(2,7)+ B(2,Cool+ B(2,9)+ B(3,7)+ B(3,Cool+ B(3,9) ~= 45)

B = A.*(A~=0) + (A==0).*round(rand(size(A))*10); end


Soweit klappt das schon ganz gut, nur würd ich es gerne jetzt so machen, dass ich eine Datei hab wo das schon alle drin steht und ich sozusagen nunoch A = . . . reinschreiben muss. (vorher muss in der Datei auch angegeben werden, das B = A ist)

Das Matlab nie auf ein Ergebnis kommen wird ist mir klar^^ weil die Wahrscheinlichkeit, dass er jemals die richtigen Zahlen zufällig trifft mehr als gegen Null geht^^


Viele Grüße
Schiroko
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2008, 11:45     Titel:
  Antworten mit Zitat      
Hallo,

ist das so was wie Sudoku oder Magic oder so ähnlich?
Ist zwar etwas unleserlich und würde wahrscheinlich mit
Code:
verständlicher werden, aber egal. Das was du realisieren willst (von der Form her), ist eine Funktion. Dein dazugehöriges M-file sieht bspw. so aus:
Code:
y = function meine_Funktion (x, a, b, c)
  y = a*x.^2 + b*x + c;
return
und muss als meine_Funktion.m gespeichert werden. Diese Funktion kann dann mit meine_Funktion(10,2,3,4) aufgerufen werden und spuckt dir dann das Ergebnis aus.
Code:
oder suche etwas im Forum, um zu erfahren, wie man Funktionen definieren kann.

MfG

PS: Code bitte in die Code-Umgebung.
Private Nachricht senden Benutzer-Profile anzeigen
 
Schiroko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2008, 19:23     Titel: . . .
  Antworten mit Zitat      
Danke Dibor. . .

"Wenn du raussiehst, was ich versucht hab zu machen, bitte bitte nicht ausschreiben, googlechen soll das nicht finden, sonst heißt es, da wo ichs abgeb, ich hab hier abgeschrieben, auch wenn ich in wirklichkeit der Poster war^^ "


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