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

Differenzen berechnen

 

mathphys
Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 16.07.2011, 20:30     Titel: Differenzen berechnen
  Antworten mit Zitat      
Hallo

ich habe m Variablen die alle anders heißen. Konkret vek1 bis vekm

Nun will ich von vek1 alle anderen Vektoren abziehen. Also vek1-vek2, vek1-vek3,...,vek1-vekm

Wie mache ich das? Ich muss dafür sicherlich auch eine Schleife nutzen, doch ich bekomme es nicht hin Sad

Danke für Hilfe.

Grüsse
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen


Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 16.07.2011, 21:35     Titel:
  Antworten mit Zitat      
Hallo,

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 = [1 2];
data.(2).m = [1 2 3 4 5 6];
data(3).m = 'das ist Text'; % auch das Speichern von Strings wäre so möglich!
% verwenden
 


Für dein Problem wäre die Lösung folgendermassen:
Code:

t = 10;
t1 = 1;
t2 = 2;
t3 = 3;

for k = 1:3
 result(k) = eval(['t-t' num2str(k)]);
end
 


MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 16.07.2011, 22:46     Titel:
  Antworten mit Zitat      
Danke soweit.

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 16.07.2011, 23:02     Titel:
  Antworten mit Zitat      
Hallo,

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

Aber am Ende muss es jeder selber entscheiden.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 16.07.2011, 23:15     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 17.07.2011, 00:02     Titel:
  Antworten mit Zitat      
Okay, ich werde es versuchen. Mal sehen ob ich damit zurecht komme...

Folgendes Problem:

Sco hat Folgendes geschrieben:

Für dein Problem wäre die Lösung folgendermassen:
Code:

t = 10;
t1 = 1;
t2 = 2;
t3 = 3;

for k = 1:3
 result(k) = eval(['t-t' num2str(k)]);
end
 



Den Code verstehe ich noch nicht, denn:

Wieso ist vor num2str(k) kein Komma?

In Anführungsstrichen steht t-t Was soll das denn? Da steht doch dann 10-10 was immer Null ist.

Wie lässt sich obiges automatisieren? Ich kann und darf ja nicht die Vektoren die ich abziehen will von Hand eingeben.

Am Ende müsste es wieder eine Liste von Differenzenvektoren geben, oder meinetwegen einer "Matrix" von Differenzenvektoren.

Danke für Hilfe
Grüsse
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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


Das Abziehen eines Vektors von allen ist dann unproblematisch. Am einfachsten, in dem man ihn auf die richtige Größe bringt:
Code:
M = M - repmat(Vektor, 1, n);


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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 17.07.2011, 00:27     Titel:
  Antworten mit Zitat      
In Ordnung, ich lasse mich wie gesagt darauf ein.

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 17.07.2011, 01:28     Titel:
  Antworten mit Zitat      
Hallo,

dies würde z.B. folgendermaßen funktionieren:

Code:

test =[ 8     9     5     8  
        1     8     5     6  
       10     4     2     4 ]; % Testmatrix  

[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.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn dich nur die Normen der Differenzen interessieren, wird der Code von sco und die Idee dahinter etwas übersichtlicher.

Code:
test =[ 8     9     5     8  
        1     8     5     6  
       10     4     2     4 ]; % 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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 17.07.2011, 14:29     Titel:
  Antworten mit Zitat      
Hi

danke für die Hilfe. Ich werde mit Matrizen arbeiten.

In deinem Code Harald, müsste es beim erstellen der Ergebnis Matrix nicht

Code:
diffValues = zeros(rows,cols);


heißen? Wieso denn nur die Spalten?

Den Code sehe ich mir weiter an, da ich verstehen will was da passiert. Ich werde versuchen mit möglicht wenig eval zu arbeiten.

Gruß
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 17.07.2011, 14:36     Titel:
  Antworten mit Zitat      
Ich denke ich habe den Code verstanden. Ich bekomme einen Fehler und weiß nicht weshalb. Ich habe den Code so abgeändert:

Code:
[rows cols] = size(data_final);
diffValues = zeros(rows,cols);
for k = 1:rows
    temp = bsxfun(@minus,data_final,data_final(:,k));
    diffValues(:,k) = sqrt( sum( temp.^2 ) );
end


und erhalte als Fehler

Zitat:
??? Subscripted assignment dimension mismatch.

Error in ==> date_input at 34
diffValues(:,k) = sqrt( sum( temp.^2 ) );


Was ist falsch? Ich möchte, dass von jeder Zeile alle anderen Zeilen abgezogen werden.

Gruß
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 17.07.2011, 15:07     Titel:
  Antworten mit Zitat      
Ich bin ein Depp. Jetzt sollte es stimmen?

Code:
[rows cols] = size(data_final);
diffValues = zeros(rows,cols);
for k = 1:rows
    temp = bsxfun(@minus,data_final,data_final(k,:));
    diffValues(k,:) = sqrt( sum( temp.^2 ) );
end


Ich habe in der Matrix im Argument das
Code:
was die k-te Spalte meint ersetzt zu
Code:
, damit ich auch die k-te Zeile gewinne
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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 =[ 8     9     5     8  
        1     8     5     6  
       10     4     2     4 ];
   
[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


Wie gesagt, Vektoren in den Spalten ist einfacher.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

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 - 2025 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.