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 aus mehreren Matrizen auf der Diagonalen

 

Janine
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 15:25     Titel: Matrix aus mehreren Matrizen auf der Diagonalen
  Antworten mit Zitat      
Hallo zusammen,

ich schreibe an einem Programm, dass mir aus übergebenen Parametern eine Matrix zusammenstellt. Die Endmatrix setzt sich in folgender Form aus anderen Matrizen zusammen:

M =
[A1, -A1, 0, ............. , 0;
0, A2, -A2, 0, ........... , 0;
0, 0, A3, -A3,0, ........ , 0;
...................................;
0, .....................An, -An]

Also A1 bis An sind sind beliebig viele Matrizen, die auf der ersten Diagonale stehen sollen und die jeweils negativen Matrizen auf der 2. Diagonalen, der Rest wird mit Nullen aufgefüllt. Ich dachte dabei zuerst an den Befehl diag(). Da ich ja aber ganze Matrizen auf die Diagonale setzen möchte, komme ich damit irgendwie nicht weiter...
Gibt es eine Möglichkeit die Matrix auf Grund ihrer "Fastdiagonalform" effektiv zusammenzusetzen, ohne die einzelnen Elemente/Matrizen über Schleifen iterativ zuzuordnen?

Ich hoffe, ich konnte mein Problem verständlich machen!
Vielen Dank schon mal und viele 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: 09.06.2012, 15:51     Titel:
  Antworten mit Zitat      
Hallo,

BLKDIAG könnte helfen. Wenn A1 bis An Matrizen sind, ist mir noch nicht klar, was dann "zweite Diagonale" heißt. Sind A1 bis An gleich groß?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 15:59     Titel:
  Antworten mit Zitat      
Ohja, du hast natürlich Recht! Die 2.Diagonale ergibt in dem Zusammenhang keinen Sinn. Ich glaube, du hast es aber trotzdem schon richtig verstanden Wink
A1 bis An sind alle 4x4-Matrizen.
Dann werd ich mir jetzt mal den Befehl anschauen...

Vielen Dank für die schnelle Antwort!
Grüße,
Janine
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: 09.06.2012, 16:18     Titel:
  Antworten mit Zitat      
Hallo,

erster Vorschlag:
Code:
A1 = reshape(1:16, 4, 4);
A2 = reshape(17:32, 4, 4);
A3 = reshape(33:48, 4, 4);
A = blkdiag(A1, A2, A3);
A = [A, zeros(12, 4)] - [zeros(12, 4), A]


Für die variable Anzahl müsste man noch ein wenig Arbeit reinstecken, sollte aber auch klappen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 16:43     Titel:
  Antworten mit Zitat      
Ok, danke! Das wäre jetzt auch mein Ansatz gewesen, nachdem ich mir den Befehl angeschaut habe! Das lässt sich auf jeden Fall auch einfach auf die variable Anzahl erweitern Smile

Nun würde mich allerdings noch interessieren, ob es vom Rechenaufwand her besser ist meine bisherige Implementierung beizubehalten. Die Matrizen A1 bis An werden nämlich auch in einer Schleife erzeugt, in der ich im Moment auch die aktuelle Matrix gleich in meine Wunschmatrix schreibe und den Rest mit Nullen auffülle. Ist es besser erst alle Matrizen zu erzeugen und anschließend mit blkdiag zusammenzufügen?

Zum besseren Verständnis noch mein Code ohne blkdiag:
Code:
for i=1:n
    U = [...];
    M(4*i+1,:) = [zeros(4,i-1), U, -U, zeros(4,4*(n-i-1))];
end


Kann das mit der Zuweisung so überhaupt funktionieren?
(Die ersten 4 Zeilen der Matrix M sind bereits anders festgelegt worden.)
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: 09.06.2012, 17:06     Titel:
  Antworten mit Zitat      
Hallo,

auf jeden Fall sollte M vorbelegt werden, d.h. mit Nullen initialisiert werden.

Ansonsten wird es keine großen Unterschiede geben, wobei der Ansatz über blkdiag "eleganter" sein könnte. Was den Rechenaufwand angeht: im Zweifelsfall beides ausprobieren und schauen, was schneller ist.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2012, 18:34     Titel:
  Antworten mit Zitat      
Ja, M habe ich bereits vorbelegt. Dann werde ich einfach beides ausprobieren!
Vielen Dank nochmal für die schnellen Antworten!
Private Nachricht senden Benutzer-Profile anzeigen
 
Janine
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2012, 11:44     Titel:
  Antworten mit Zitat      
Mir ist jetzt als ich versucht habe, meine Implementierung mit blkdiag zu realisieren wieder ein Problem aufgefallen. Da ich die Matrizen A1 bis An ja auch in einer Schleife erzeuge (in Abhängigkeit von meinem Laufindex) müsste ich diese jeweils in einer eigenen Variable speichern, damit ich nachher mit blkdiag() wieder darauf zugreifen kann?! Eine Möglichkeit wäre doch nun die Variablennamen für die {Ai} mit assignin('base',['A' num2str(i)], ...) in der for-Schleife zu vergeben. Da meine Menge an Matrizen A jedoch variieren kann, bin ich etwas ratlos, wie ich das in meinem blkdiag()-Befehl integriere. Steh ich da gerade einfach schrecklich auf dem Schlauch? Wie kann ich denn eine unbekannte Menge an Matrizen übergeben, von denen ich nur weiß, dass sie A1, A2,...,An heißen? Confused
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: 11.06.2012, 20:23     Titel:
  Antworten mit Zitat      
Hallo,

so etwas geht problemlos auch ohne assignin oder etwas derartiges, z.B. so:
Code:

A = cell(1,N);
for I = 1:N
A{I} = ...
end
bigA = blkdiag(A{:})


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2012, 12:43     Titel:
  Antworten mit Zitat      
Hallo,

und noch ein Dankeschön!
So funktioniert's prima!

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