wie ich auch schon in meinem Post hier: http://www.gomatlab.de/auswahl-von-.....gen-variablen-t19030.html empfohlen habe, solltest du dir angewöhnen nicht mehrere Variablen mit den Index als Namen zu erstellen, sondern die Werte in Matrizen zusammenzufassen. Stimmen die Dimensionen nicht überein können Structs verwendet werden:
Code:
% Anstatt von:
m1 = 1;
m2 =2;
% bitte Matrix
m(1) = 1:
m(2) = 2;
% oder Struct
data(1).m = [12];
data.(2).m = [123456];
data(3).m = 'das ist Text'; % auch das Speichern von Strings wäre so möglich! % verwenden
Ich will nicht mit Matrizen arbeiten, sondern mit einzelnen Variablen. Denn dieser "Programmier-Matrix-Kalkül" bereitet mir große Bauchschmerzen.
_________________
Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
je nachdem wie intensiv du mit Matlab arbeitest bzw. arbeiten möchtest, solltest du dir aber derartige Grundlagen zu Herzen nehmen und verinnerlichen. Bezüglich des benötigten Speicherplatzes, der Übersichtlichkeit und Einfacheit ist deine Methode eben nicht gerade freundlich.
Für "uns" bereitet z.B. die Verwenung von "eval" Bauchscherzen, da die (falsche) Anwendung dieses Befehls zu einer Hülle von schwer auffindbaren Fehlern führen kann ( siehe Beiträge Jan S um weitere Probleme bei der Anwenung von eval zu erfahren). Du siehst es ja an dir selbst, dass du 2 neue Threads erstellen musstest nur um eigentlich, mit Matrixindexierung, einfache Probleme zu lösen...
Ich verliere bei diesen Zusammenfassungen das Bild womit ich es zu tun habe. Sehe ich eine Matrix, dann sehe ich eine ganz bestimmte lineare Abbildung zwischen Vektorräumen bezüglich einer ausgewählten Basis.
Keine Zusammenfassungen von irgend etwas...
Ich habe Mathematik studiert und ich komme hiermit nicht klar. Ich denke, ich möchte das Risiko von Unübersichtlichkeit eingehen.
Gruß
_________________
Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Ich kann (übrigens auch als Mathematiker) nur dringendst empfehlen, den Rat von sco zu befolgen. Das Arbeiten mit vielen Variablen mag momentan der bequemere Weg sein, aber spätestens wenn eine Anwendung mal etwas komplexer wird oder sie nicht tut was sie soll und es ans Debuggen geht, ist man mit vielen Variablen und eval hoffnungslos verloren.
Code mit eval neigt eben schnell dazu, unübersichtlich zu werden. Deswegen wollen sco und ich dich ja dazu bringen, mit Matrizen von Vektoren statt mehreren Variablen zu arbeiten.
Zunächst wird diese Matrix erzeugt:
Code:
M = zeros(m, n) for I = 1:n
M(:,I) = (I-ter Vektor);
end
Was die Automatisierung angeht, so müssen diese Vektoren ja irgendwo herkommen. Und davon, wo sie herkommen (z.B. Datei, Zufallsdaten, irgendeine Systematik), hängt dann auch die Art der Automatisierung ab.
Dein Beispielcode habe ich verstanden. Danke soweit.
Stimmt, automatisieren muss präziser formuliert werden. Daran denke ich auch jetzt als nächstes, da ich nicht weiß wie es weiter geht mit diesem Matrix Kalkül. Ich formuliere das Problem kurz:
Ich habe m Zeilenvektoren, von mir aus in einer Matrix mit m Zeilen und drei Spalten.
Ich will von jedem Vektor die Differenzen Vektoren zu allen anderen berechnen und nummerieren.
Also ich nehme mir beispielsweise den 1. Vektor her und bilde die Differenz mit allen anderen und nummeriere alle diese Differenzen. Dann nehme ich den zweiten her und bilde ebenfalls die Differenz zu allen anderen. Das mache ich so lange, bis ich den m-ten hernehme und alle Differenzen bilden.
Von dieser riesigen Liste muss ich dann von allen Differenzen die Norm berechenen.
Keine Ahnung wie dies mit Matrix Kalkül umgesetzt werden soll.
Mit Vektoren war die Idee eben, dass ich jeweils eine Liste dynamischer Variablen erzeuge für jede Differenzenberechnung, damit ich dann am Ende in einer for Schleife die vielen Längen ausrechnen kann.
Das ist die Idee
Gruß
_________________
Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
[rows cols] = size(test); % Dimension der Matrix (Anzahl der Zeilen und Spalten, 3x4)
diffValues = zeros(rows,cols-1,cols); % Erstellung der Ergebnis Matrix damit die Schleife schneller läuft (siehe "preallocating")
for k = 1:cols % Schleife über alle Spalten (von 1 bis 4)
idx = setdiff(1:cols,k); % Ermittlung der Indexe der Spalten die von der aktuellen Spalte abgezogen werden sollen (alle ausser die aktuelle Spalte)
diffValues(:,:,k) = bsxfun(@minus,test(:,k),test(:,idx)); % Durchführung der Subtraktionen. Je Schleifendurchgang wird eine Spalte von den anderen Spalten abgezogen. Die Ergebnismatrix ist 3 dimensional und enthält in jeder der 3. Dimensionen die Differenzen einer Matrixspalte mit allen anderen Spalten. end
diffValues(:,:,1)% zeigt die Differenzen der ersten Spalte mit allen anderen Spalten
diffValues(:,:,2)% zeigt die Differenzen der zweiten Spalte mit allen anderen Spalten, usw...
Ich habe den Code so gut es geht kommentiert, lies dir die Hilfe zu den Befehlen durch falls du etwas nicht verstehst oder speicher den Code als Funktion ab und verwende den Debugger Mode Zeile für Zeile und schau was passiert.
Prinzipiell würde ich dir auch raten mal das "Ghetting Started" von Matlab durchzulesen, darin werden die Grundlagen beschrieben. Natürlich sind wir ein Matlab-Forum und helfen gerne, jedoch sind deine Fragen oftmals darauf zurückzuführen, dass dir einfach komplett die Grundlagen von Matlab fehlen.
wenn dich nur die Normen der Differenzen interessieren, wird der Code von sco und die Idee dahinter etwas übersichtlicher.
Code:
test =[8958 1856 10424]; % Testmatrix
[rows cols] = size(test); % Dimension der Matrix (Anzahl der Zeilen und Spalten, 3x4)
diffValues = zeros(cols,cols); % Erstellung der Ergebnis Matrix damit die Schleife schneller läuft (siehe "preallocating")
for k = 1:cols % Schleife über alle Spalten (hier von 1 bis 4)
temp = bsxfun(@minus,test,test(:,k)); % Durchführung der Subtraktionen. Je Schleifendurchgang wird eine Spalte von allen Spalten abgezogen.
diffValues(:,k) = sqrt(sum( temp.^2)); % Berechnung der Norm über die Definition der Norm. Vorteil gegenüber Befehl norm ist, dass das spaltenweise geht. end
Als Ergebnis hast du eine Distanzmatrix, in der diffValues(i, j) die Norm der Differenz zwischen Vektoren i und j ist. Da die Entfernung des Vektors von sich selbst 0 ist, stehen in der Diagonale Nullen.
ich würde zwei Sachen vorschlagen:
1) Mit Vektoren in Spalten arbeiten. Das macht das Leben an vielen Stellen einfacher, weil Funktionen wie SUM die Spalten einer Matrix als separate Variablen betrachten.
2) An einfachen Argumenten ausprobieren, ob die Befehle das richtige tun. Bei deiner Variante habe ich meine Zweifel.
Dass ich cols zweimal verwendet habe, war Absicht. Das war in meinem Fall die Anzahl der Vektoren.
Wenn du die Vektoren in den Zeilen der Matrix speichern willst, sähe es so aus:
Code:
data_final =[8958 1856 10424];
[rows cols] = size(data_final);
diffValues = zeros(rows,rows); % jetzt ist rows die Anzahl der Vektoren for k = 1:rows
temp = bsxfun(@minus,data_final,data_final(k,:));
diffValues(k,:) = sqrt(sum( temp.^2, 2))'; % man muss die Norm jetzt über die Zeilen nehmen, daher das ,2. Am Ende transponieren, damit die Dimensionen stimmen. end
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
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.