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

Bestimmte Elemente zweier Matrizen vertauschen

 

Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2012, 10:10     Titel: Bestimmte Elemente zweier Matrizen vertauschen
  Antworten mit Zitat      
Hallo liebe Matlab-Gemeinde,

bei meiner derzeitigen Arbeit habe ich öfter das Problem, dass ich bestimmte Teile bzw. Elemente zweier Matrizen vertauschen soll. Dies habe ich bis jetzt immer über den folgenden Umweg gemacht:
Code:

position = logical([0 1 0; 1 1 0; 1 0 0]);

A = [1 1 1; 2 2 2; 3 3 3];
B = [4 4 4; 5 5 5; 6 6 6];

temp = A(position);
A(position) = B(position);
B(position) = temp;
 

Ich hoffe durch dieses Beispiel wird auch klar, was ich machen will.
Hier nun meine Frage: Gibt es eine Funktion, die dieses Vertauschen durchführt? Auch wenn es kein großes Problem darstellt diese Zeilen zu tippen, würde es doch die Lesbarkeit des Codes erhöhen.
Vielen Dank im voraus für die Hilfe,
mfg

Ajax
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 14.03.2012, 10:19     Titel:
  Antworten mit Zitat      
das problem glaube ich bestand schonmal. und ich glaube es gab keinen befehl der direkt swapt. nur über deine zwischen speichern lösung. wenn man keine 3. matrix will kann man das auch noch mit summen und differenzen innerhalb der 2 matrizen lösen aber dadurch wird der code auch nicht lesbarer.
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Themenstarter

Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2012, 10:38     Titel:
  Antworten mit Zitat      
Alles klar, vielen Dank für die schnelle Antwort.
Viele Grüße,

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

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.03.2012, 11:07     Titel:
  Antworten mit Zitat      
Hallo,

wenn du das öfter verwendest, kannst du dir ja selbst eine Funktion dazu schreiben:

Code:
function [A, B] = swapPositions(A, B, positions)


... und da deinen Code reinplazieren.

Dann diese Funktion immer aufrufen, wenn du das machen möchtest.

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

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 14.03.2012, 11:46     Titel:
  Antworten mit Zitat      
Hallo,

so etwas ähnliches hatte ich auch schon mal, und lass dir gesagt sein, dass ganze Matrizen durch Funktionen zu schicken und dort zu verändern, leider ziemlich langsam ist, da Matlab dann wirklich Matrizen kopiert und keine Verweise nimmt.
Das macht die Sache zwar lesbarer, wird aber bei großen Matrizen mindestens um Faktor 2-3 langsamer. In der Regel verändere ich Matrizen daher nicht mehr in Funktionen (selbst wenn nur ein einziger Eintrag verändert wird, kopiert Matlab die ganze Matrix).

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

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.03.2012, 12:02     Titel:
  Antworten mit Zitat      
Hallo Nras,

das ist nur teilweise korrekt.

Wenn A an eine Funktion übergeben wird und dort nicht verändert wird, wird keine Kopie angelegt.
Dieses Verhalten ist auch als "copy-on-write" - Verhalten bekannt, siehe z.B. hier:
http://blogs.mathworks.com/loren/20.....-functions-and-variables/

Auch wenn A an eine Funktion übergeben, verändert und wieder zurückgegeben wird
Code:

und diese Funktion so aufgerufen wird
Code:
[..., B, ...] = test(..., B, ...)
wird keine Kopie von A oder B angelegt.
Dieses Verhalten ist als "in-place operations" bekannt, siehe z.B. hier
http://blogs.mathworks.com/loren/20.....place-operations-on-data/
Man muss dabei darauf achten, in der Funktion durchgängig denselben Variablennamen zu verwenden und ebenso beim Aufruf. Ansonsten werden in der Tat Kopien erzeugt, und das kann den Code ausbremsen.

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

Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2012, 13:24     Titel:
  Antworten mit Zitat      
Auf die eigene Funktion hätte ich natürlich auch selber kommen können... Aber ich dachte so eine doch relativ simple Sache gibt es bestimmt direkt bei Matlab.
Vielen Dank noch einmal für die Hilfe!
mfg

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