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

Hauptdiagonale mit jeweiliger Zeile addieren

 

matlabgo
Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 16.08.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2018, 18:07     Titel: Hauptdiagonale mit jeweiliger Zeile addieren
  Antworten mit Zitat      
Hallo liebe Community,
habe folgendes Problem.
Die Aufgabe lautet:
-->Schreiben Sie eine rein schleifenbasierte Funktion calcMat, die für eine M × N Matrix A in allen Zeilen jeweils
ab dem Hauptdiagonalelement einschließlich den Wert dieses Hauptdiagonalelements addiert (siehe Beispiel unten).
Die so modifizierte Matrix soll als Funktionswert zurück gegeben werden.<--

Bisher bin ich so weit gekommen:
Code:
function[B] = calcMat(A)

B = A;

x = diag(B);
m = 1;
for k = 1:size(B,2)
    for l = 1:size(B,1)
       
    B(k,l) = B(k,l) + x(m)
   
   
     m = m+1 ;  
   
end
end

   
 


Für die erste zeile klappt dies auch, jedoch dannach kommt die fehlermeldung,:
Index exceeds array bounds.

Kann mir jemand weiterhelfen?
Private Nachricht senden Benutzer-Profile anzeigen


J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 16.08.2018, 20:14     Titel:
  Antworten mit Zitat      
Hi matlabgo,

Kannst du Mal das Beispiel, von dem da die Rede ist Posten? In der Aufgabenstellung fehlt mindestens ein Wort.

Dann schau dir auf jeden Fall Mal an welche Dimensionen du beim size Befehl ausliest und welche du in der Schleife unten verwendest.

Mehr dann mit dem Beispiel.

Gruß
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabgo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 16.08.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2018, 20:34     Titel:
  Antworten mit Zitat      


Unbenannt.png
 Beschreibung:

Download
 Dateiname:  Unbenannt.png
 Dateigröße:  22.37 KB
 Heruntergeladen:  266 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 16.08.2018, 20:47     Titel:
  Antworten mit Zitat      
Hi matlabgo,

also erstmal das mit den Dimensionen berücksichtigen (siehe oben).
Und dann schau dir mal an welche Werte k,l und m annehmen wenn der Fehler auftritt, da müsstest du dann gleich sehen woran es liegt. Eine dieser Variablen nimmt einen Wert an, der größer als die Dimensionen deiner Matrix ist.

Da das offensichtlich Hausaufgaben sind werde ich dir keine finale Lösung posten.
Solltest du nicht auf die Lösung kommen, kann ich dir aber noch weiter helfen Smile Aber wenn man selbst auf die Lösung kommt lernt man bekanntlich am meisten!

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabgo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 16.08.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2018, 21:06     Titel:
  Antworten mit Zitat      
ich stehe grade wirklich auf dem Schlauch, was meinst du mit den Dimensionen?
meines Erachtens ist das gleich(?)..
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 16.08.2018, 21:42     Titel:
  Antworten mit Zitat      
Ich meine damit, dass deine Matrix B zwei Dimensionen hat nämlich B(dim1,dim2). Wenn du also B(k,l) beschreiben willst, dann ist k die erste Dimension und l die 2.Dimension. Folglich sollte deine Schleife für k auch die Länge von Dimension 1 ablaufen ->
Code:

und l eben die 2. Dimension.
Sind beide Dimensionen der Matrix gleich groß, dann funktioniert das aber logischerweise auch wenn es falsch zugeordnet wird.


Bevor du eine Funktion aus dem ganzen machst kannst du das auch einfach mal so, außerhalb einer Funktion, starten. Hat den Vorteil, dass die Variablen im Workspace abgelegt werden. Wenn du jetzt folgenden Code laufen lässt, bekommst du auch deine Fehlermeldung (die Dimensionen bei den size habe ich hier schon angepasst).
Code:

A = ones(5); % Beispielmatrix

B = A;
x = diag(B);

m = 1;
for k = 1:size(B,1)
    for l = 1:size(B,2)
     B(k,l) = B(k,l) + x(m)
     m = m+1 ;  
end
end


Wenn die Fehlermeldung kommt, dann schau dir im Workspace mal die Werte für k,l und m an und überlege dir welcher Wert nicht passen kann.
Entwder ist k größer als die 1. Dimension der Matrix (im Beispiel also >5).
Oder l ist größer als die 2. Dimension der Matrix (also auch >5).
Oder m ist größer als die Dimension der Diagonale (also auch >5).

Und wenn du das rausbekommen hast wirst du feststellen, dass du einen dieser Werte nach dem Durchlauf einer Schleife wieder resetten musst. Vielleicht hilft dir das weiter.
Der nächste Schritt wäre aber dann schon fast die Lösung. Und das wäre ja langweilig, oder? Very Happy Wink

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabgo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 16.08.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2018, 22:02     Titel:
  Antworten mit Zitat      
Ahso, jetzt hab ich es verstanden.
Es geht darum dass, ich die Dimensionen vertauschen musste, damit ich erst die erste Spalte abarbeite und dannach zur zweiten rüber gehe.
und das m musste aus der for schleife raus, da es sonst zu groß wird.

Meine abschließende Frage wäre dann, aber wie ich es hin bekomme, dass er genau ab der Diagonalen anfängt zu addieren?
z.B. bei in der 2 zeile ab A(2,2)
in der 3 zeile ab A(3,3)
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabgo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 16.08.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2018, 22:06     Titel:
  Antworten mit Zitat      
Mein Vorschlag wäre sowas in der Art, aber dann bildet er nur die Diagonale.


Code:
A = ones(5); % Beispielmatrix

B = A;
x = diag(B);

m = 1;

for k = 1:size(B,1)
   
    for l = 1:size(B,2)
       
  if k == l
     B(k,l) = B(k,l) + x(m)
  end
 
 
    end
   m = m+1 ;  
 
end
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 17.08.2018, 06:22     Titel:
  Antworten mit Zitat      
Hallo matlabgo,

Tritt der Fehler auf, ist (im Beispiel) dein k=2, l=1 und b=6. Er hat die erste Zeile komplett durchlaufen und soll jetzt die 2. Zeile bearbeiten -> k = 2, passt. Er soll in der 2. Zeile beim 2. Element anfangen, aber l = 1 -> passt nicht, muss angepasst werden. Er soll das 2. Element der Hauptdiagonale addieren, aber m = 6 -> passt auch nicht.

Noch offensichtlicher wird das ganze wenn du bei der Testmatrix mal auf der Hauptdiagonale unterschiedliche Werte angibst.
Dann stellst du fest, dass er in die erste Zeile springt, dort in der ersten Spalte den Wert zu dem ersten Element der Hauptdiagonale addiert. In der zweiten Spalte den Wert zu dem zweiten Element der Hauptdiagonale addiert, usw.
Was du willst ist aber, dass das Hauptdiagonalen-Element in der komplette Zeile gleich bleibt. Daher muss das hochzählen des Hauptdiagonalen-Elements geschehen, nachdem alle Spalten der Zeile durchlaufen wurden, wir ziehen das m = m + 1 also raus aus der "Spalten-Schleife".
Nächste Problem: Du musst für jede Zeile, die Anfangsspalte anpassen. Glücklicherweise muss ja auch der Zähler der Hauptdiagonale jede Zeile gleichermaßen angepasst werden:
1. Zeile -> 1. Hauptdiagonalenelement
1. Zeile -> Anfangsspalte = 1
2. Zeile -> 2. Hauptdiagonalenelement
2. Zeile -> Anfangsspalte = 2
...
Wir lassen also den Anfang der "Spalten-Schleife" bei jeder neuen Zeile eins größer werden indem wir die Zählervariable m der Hauptdiagonalen nutzen:

Code:

    for l = m:size(B,2)
 


Jetzt noch das m an der richtigen Stelle hochzählen lassen (siehe oben) und dann hast du die Lösung.

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabgo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 16.08.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2018, 10:38     Titel:
  Antworten mit Zitat      
Super, danke hat alles geklappt !!
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.