Matrix aus n Zeilen erzeugen < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 15:26 Mi 02.05.2012 | Autor: | bmtil |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Hallo, ich bin sehr neu im Gebiet Matlab Programmierung, und habe eine Frage, die vermutlich jeden Matlab Profi zum Lachen bringt.
Und zwar, ich erzeuge mir eine randomisierte dreidimensionale Matrix A:
zum Bsp. so:
a = 0; &untere Intervallgrenze
b = 1; &obere Intervallgrenze
A = round(50 * (a + (b-a) * rand(7,7,9)))
Nun möchte ich eine zufällige ganzzahlige reelle Zahl erzeugen, die kleiner ist, als die maximale Anzahl an Zeilen dieser Matrix A, also zwischen 0 und 6. Wie kann ich das in Matlab eingeben?
hab das mit:
r=round(randn(0,6));
versucht, aber irgendwie klappt es nicht.
desweiteren möchte ich dass mir eine neue Matrix A' erzeugt wird, indem von der alten Matrix A, die ersten r Zeilen genommen werden.
also irgendwie so soll es aussehen:
A'=A(r, r, 9);
Mit freundlichen Grueßen und vielen Dank.
|
|
|
|
hi,
> Ich habe diese Frage in keinem Forum auf anderen
> Internetseiten gestellt.
> Hallo, ich bin sehr neu im Gebiet Matlab Programmierung,
> und habe eine Frage, die vermutlich jeden Matlab Profi zum
> Lachen bringt.
>
> Und zwar, ich erzeuge mir eine randomisierte
> dreidimensionale Matrix A:
>
> zum Bsp. so:
> a = 0; &untere Intervallgrenze
> b = 1; &obere Intervallgrenze
>
> A = round(50 * (a + (b-a) * rand(7,7,9)))
>
Ich frage mich ob das einfacher geht. Matlab hat ne schlecht Dokumentation m.E. Vielleicht geht auch soetwas wie rand(7,7,[min,max]). Kann ich grad nicht testen.
> Nun möchte ich eine zufällige ganzzahlige reelle Zahl
> erzeugen, die kleiner ist, als die maximale Anzahl an
> Zeilen dieser Matrix A, also zwischen 0 und 6. Wie kann
> ich das in Matlab eingeben?
Der Befehl ist randi(...) von RandInteger
> hab das mit:
> r=round(randn(0,6));
> versucht, aber irgendwie klappt es nicht.
>
> desweiteren möchte ich dass mir eine neue Matrix A'
> erzeugt wird, indem von der alten Matrix A, die ersten r
> Zeilen genommen werden.
>
> also irgendwie so soll es aussehen:
>
> A'=A(r, r, 9);
Das ' transponiert die Matrix. Das geht also nicht. Als erstes würde ich dir zur Verbesserung die Umbennenung
AA=A(r,r,9) vorschlagen
In Wirklichkeit geht das aber so
r=4;
AA = A(1:r,1:r);
>
> Mit freundlichen Grueßen und vielen Dank.
freundliche Grüße zurück
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:18 Do 03.05.2012 | Autor: | bmtil |
Vielen Dank für die Antwort.
Irgendwie funktioniert bei meiner 2008a Matlab version der Befehl randi nicht.
Wenn ich eingebe
n = randi (10,100); &erzeuge mir eine Zufallszahl n zwischen 10 und 100
kommt die Fehlermeldung: ??? Undefined function or method 'randi' for input arguments of type 'double'
Bin gerade echt am verzweifeln was das angeht.
Anyway, ich hab jetzt eine etwas veränderte Aufgabe.
Im Pseudocode sieht sie so aus:
Zuerst erzeugt man eine Matrix A (zufaellige Matrix, wie das geht weiss ich nun).
Dann "wuerfelt" man zwei Zahlen.
Erste Zahl k bestimmt den "Startwert", ab der Zeile mit dieser Nummer, werden die Zeilen gepickt.
Die Anzahl der gepickten Zeilen bestimmt die zweite gewürfelte Zahl n. Vorgang wird so oft wiederholt bis die neue Matrix B voll ist.
Leider bin ich gerade voellig verzweifelt an dem schreiben von dem richtigen Code, da ich mit der Matlab syntax voellig ueberfordert bin.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:28 Do 03.05.2012 | Autor: | wieschoo |
Das bekommst du schon hin. Poste mal alles, was du meinst schon zu haben. Ich Schau mir das heute den späten Nachmittag an.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:20 Do 03.05.2012 | Autor: | bmtil |
a = 0; &untere Intervallgrenze
b = 1; &obere Intervallgrenze
A = round(50 * (a + (b-a) * rand(11,11))) &bau mir eine 11x11 zufaellige Matrix
n = randi(1,11) &bau mir eine ganzzahlige Zufallszahl n, im Bereich 1 bis 11
k = randi(1,11) &bau mir eine ganzzahlige Zufallszahl k, im Bereich 1 bis 11
&n = Startwert, ab diesem Startwert werden die Zeilen der Matrix A ausgewaehlt
&k = Anzahl, ab Startwert n, werden k Zeilen genommen und der neuen Matrix B zugeführt
so, ein weiteres Problem, wie sage ich dass die Matrix B, aus den neuen k Zeilen der Matrix A besteht.
Dann, ist das der erste Durchlauf. Beim zweiten Durchlauf müssen wieder n und k gewürfelt, wieder dadurch die Zeilen bestimmt, und den bereits bestehenden Zeilen der Matrix B zugefügt.
Das ganze so lange, bis Matrix B 100 neue Zeilen hat.
Vielen Dank und freundliche Grueße.
|
|
|
|
|
Hat länger gedauert.
> Vielen Dank für die Antwort.
> Irgendwie funktioniert bei meiner 2008a Matlab version der
> Befehl randi nicht.
> Wenn ich eingebe
> n = randi (10,100); &erzeuge mir eine Zufallszahl n
> zwischen 10 und 100
randi ist im alten Matlab randint
Um eine Zahl [mm] $k\in\{min,\ldots,max\}$ [/mm] zufällig zu wählen geht also
k=randint(1,1,[min,max]);
ich würde also so anfangen
MatrixDimension = 10; % Matrixgroesse
MinRange = 0; % A hat Einträge >= MinRange
MaxRange = 5; % A hat Einträge <=MaxRange
wobei ich mir nicht mehr sicher bin ob > oder >= und < oder <=.
Das zufällige Erzeugen geht also so
A=randint(MatrixDimension,MatrixDimension,[MinRange,MaxRange]);
Die Zielmatrix sollte ersteinmal leer sein
B=[];
jetzt würde ich mir merken, wie viele Zeilen schon besetzt sind
visitedRows = 1; % merken der neu besetzten Zeilen
Probier mal folgenden Misch-Matlab-Pseudo-Code umzusetzen
solange visitedRows kleiner als MatrixDimension
wähle k zufällig zwischen "1" und "Matrix Dimension-1"
wähle n zufällig zwischen "1" und "Matrix Dimension-k"
B = [B;A(k:k+n,:)];
visitedRows = visitedRows + n;
ende solange
Damit würde folgendes entstehen:
A =
5 4 5 1
0 4 3 0
5 3 0 0
0 5 1 3
B =
5 3 0 0
0 5 1 3
0 4 3 0
5 3 0 0
0 5 1 3
Hoffentlich habe ich richtig verstanden, was du möchtest. Darf man fragen welchen Hitnergrund die Aufgabe hat? Oder ist das "nur" eine Übungsaufgabe?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:25 Do 03.05.2012 | Autor: | bmtil |
Vielen Dank fuer die Hilfe.
So hab ich das gemeint.
Der Hintergrund der Aufgabe ist eine groeßere Optimierungsaufgabe.
Es geht darum einen Tabu Search Algorhitmus zu entwickeln, welcher die minimale Konditionszahl einer sogenannten Lead Field Matrix bestimmt.
In der Lead Field Matrix sind bestimmte Magnetfeldsensoren über ihre Positionen verteilt. Das Problem ist, dass in dieser Matrix redundante Informationen enthalten seien können, die Anzahl der Sensoren ist im 4 stelligen Bereich.
Aus dieser Lead Field Matrix muss eben eine neue Matrix erzuegt werden, indem zufaellig Zeilen ausgewaehlt werden. Aus der neuen Matrix wird dann die Condition Number bestimmt, je geringer diese ist, desto hoeher ist der Informationsgehalt. Das ganze ist quasi dann die "neighborhood function" Nachbarschaftsfunktion des Tabu Suche Algorhitmus. Indem diese neue Matrix bestimmt wurde, und die zu der Liste der moeglichen Loesungen zugefuegt wird, versucht dann der Algorhitmus vorherzusagen wie die optimale erzeugte Matrix aus der Lead Field Matrix auszusehen hat, also die geringste Condition Number besitzt.
Und das ist eben ein Teil des großen programms, wie ich eben aus der Lead Field Matrix eine neue zufaellig erzeugen kann, war meine Idee und ich wollte testen.
Ich weiss, ist eine riesengroße Aufgabe und es wird ganz schoen knackig sein, den Kram zu programmieren, vorallem in voellig neuer Syntax. Mit LabView haette ich da nicht solche Probleme ^^.
Mit freundlichen Grueßen
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:12 Do 03.05.2012 | Autor: | wieschoo |
Cool, danke. Da ist das nicht so "trocken". Gibt es da eventuell ein empfehlenswertes Paper in der Richtung.
Man kann nie genug wissen
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:08 Fr 04.05.2012 | Autor: | bmtil |
Also, hier ist mal meine Umsetzung des Pseudocodes. Hab das ganze intuitiv mit der While-Schleife gebaut:
>> while visitedRows < MatrixDimension
k=randint(1,1,[1,MatrixDimension-1]); %wähle k (startwert) zwischen 1 und MatrixDimension-1
n=randint(1,1,[1,MatrixDimension-k]); %wähle n zufällig zwischen "1" und "Matrix Dimension-k"
B = [B;A(k:k+n,:)]; %Zielmatrix B wird mit zufaelligen Reihen aus der Matrix A befuellt
visitedRows = visitedRows + n;
end
DAs ist schonmal ziemlich cool.
Ich hoffe ich bin nicht zu sehr auf die Nerven gegangen und hoffe dass ich hier weiterhin Fragen stellen kann/darf, also dass meine Fragen nicht son trivial waren.
<Was die Paper zu der Lead Field Matrix angeht, gibt eigentlich genuegend bei google zu finden, bzw. die Abstracts.
Grueße
|
|
|
|