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 erstellen aus Differenzen

 

Gast25

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2011, 10:08     Titel: Matrix erstellen aus Differenzen
  Antworten mit Zitat      
Hallo zusammen,

ich habe erst vor ein paar Tagen angefangen mit Matlab zu arbeiten. Habe direkt eine (für euch wahrscheinlich einfache) Frage. Ich habe einen Vektor, bzw. eine n*1-Matrix mit verschiedenen Werten. Daraus möchte ich eine Matrix bauen, die alle Differenzen enthält. Das Matrix-Element 1,1 soll somit die Differenz zwischen dem Vektorelement 1 und 1 haben (also null). Das Element 2,1 die Differenz zwischen dem vektorelement 2 und 1 usw. Das ganze will ich sozusagen als Funktion haben um das auf einen beliebigen Vektor v anwenden zu können (also muss noch sowas wie eine Abhängigkeit von length(v) für die Größe der Matrix rein). Es dürfte sich eine Matrix ergeben, die symmetrisch ist und eine Diagonale mit Nullen besitzt.
Kann mir jemand helfen? oder ist das Problem zu unklar beschrieben?


Harald
Forum-Meister

Forum-Meister


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

Code:
function M = differenz(v)
v = v(:); % als Spaltenvektor
n = length(v);
M = repmat(v, 1, n); % v n mal nebeneinanderschreiben
M = abs(bsxfun(@minus, M, v')); % von jeder Spalte das richtige abziehen


Wenn das nicht das ist, was du willst, dann ist es zu unklar beschrieben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 16.07.2011, 11:01     Titel:
  Antworten mit Zitat      
Hallo Harald,

die Funktion "bsxfun" ist meiner Matlab Version nicht bekannt. Gibt es dazu auch eine Alternative?

Geht es nicht auch damit?

Code:

c = [1  2  3  4  5];
toeplitz(c)-c(1)

ans =

     0     1     2     3     4
     1     0     1     2     3
     2     1     0     1     2
     3     2     1     0     1
     4     3     2     1     0
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bsxfun wurde in MATLAB 2007a eingeführt. Wenn du eine ältere Version verwendest, wird sie bsxfun in der Tat nicht erkennen.

Hier eine Alternative ohne bsxfun:
Code:
function M = differenz2(v)
v = v(:); % als Spaltenvektor
n = length(v);
M = repmat(v, 1, n);
M = abs(M - repmat(v', n, 1));

Allerdings wird hier temporär eine zweite Matrix angelegt, die ebenso groß ist wie M. Bei großen Vektoren kann eine solche Speicherverschwendung zum Problem werden.

Mein Eindruck ist, dass deine Lösung nur in Spezialfällen das gleiche macht. Probier es mal mit einem Vektor von Zufallszahlen...

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 16.07.2011, 11:40     Titel:
  Antworten mit Zitat      
Alles klar...Danke.

Edit: hast Recht...es geht nur in einigen Spezialfällen Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast25

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2011, 15:12     Titel:
  Antworten mit Zitat      
Super, vielen Dank.
Bin erst am Montag wieder bei der Arbeit im Matlab und probiere es dann aus.
Habe einen Fehler gemacht, meinte nicht symmetrische Matrix. oberhalb von der Diagonalen sollten dieselben Werte, aber negativ stehen.
Die erste Spalte enthält: v(1,1)-v(1,1), v(2,1)-v(1,1), v(3,1)-v(1,1)... die zweite Spalte enthält: v(1,1)-v(2,1), v(2,1)-v(2,1), v(3,1)-v(2,1) usw...
Der Vektor ist z.b. v = [1 5 7 10 14]
Also ist die Matrix:

0 -4 -6
4 0 -2
6 2 0 usw..

Vielen Dank für die Hilfe
 
Harald
Forum-Meister

Forum-Meister


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

dann musst du nur das ABS in meinem Code weglassen.

Grüße,
Harald
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 - 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.