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 ab bestimmter Zeile zeilenweise subtrahieren

 

rashica2103
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 12.12.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2019, 17:48     Titel: Matrix ab bestimmter Zeile zeilenweise subtrahieren
  Antworten mit Zitat      
Hallo,

Ich bin noch kompletter Anfänger und komme bei einem wohl sehr einfachen Problem leider nicht weiter.

Ich habe 2 Matrizen A und B. Solange in der Matrix A ein Wert größer ist als z.B. 400, soll bei Matrix B ab einer bestimmten Zeile (z.B. ab Zeile 2), jeder Wert der Zeile mit -1,-2,-3,-4...etc. subtrahiert werden.

Matrix B sollte dann beispielsweise so aussehen:
200 200 200
199 199 199
198 198 198
197 197 197 (ab hier ist A(i) = 400)
197 197 197
197 197 197
..und so weiter

Code:

anzahlWerte = size(A,1)*size(A,2);              % Anzahl Datenpunkte Matrix
                                                                 
for i = 1:anzahlWerte
    while A(i) > 400
        for j = 2:10
 
           B(j,:)=B(j,:)- 1;                              % so funktioniert das nicht
           
        end
       
    end
end                                                  
 


Wäre über jeden Tipp sehr dankbar!
Private Nachricht senden Benutzer-Profile anzeigen


rashica2103
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 12.12.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2019, 17:14     Titel:
  Antworten mit Zitat      
Das einzige was mir einfiel, ist eine Matrix zu erstellen, die entsprechend jede Zeile mit 1,2,3..etc. subtrahiert. Das ist aber 1. etwas umständlich und 2. macht der Code immer noch nicht das was ich eigentlich haben will.

Code:

% ab Zeile 601 soll jede Zeile von B um 1,2,3,4...abnehmen bis Bedingung A(i) > 400 nicht mehr erfüllt ist

KR=-reshape(1:601,601,1);        
KR_matrix=repmat(KR,1,100);        

KR_subtr=zeros(1201,100);          
KR_subtr(601:1201,:)=KR_matrix;        

anzahlWerte = size(A, 1)*size(A,2);  

for i = 1:anzahlWerte
    while A(i) > 400
            B=B+ KR_subtr;              
    end
end
 


Kann mir jemand helfen? Ich stehe echt auf dem Schlauch und bin langsam am verzweifeln Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

mir zumindest ist nicht klar, was du erreichen möchtest. Bisher verstehe ich nur, dass ab irgendwann irgendwo irgendwas abgezogen werden soll.

Wenn du am Anfang zwei Matrizen hast, wäre es hilfreich, einen ausreichenden Ausschnitt von beiden zur Verfügung zu stellen. Dann noch das gewünschte Ergebnis, und das ganze dürfte viel klarer werden.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
rashica2103
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 12.12.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2019, 18:19     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die schnelle Antwort!

Matrix B ist eine 1201x100 Matrix mit dem Anfangswert 300.
Code:
B= 300 * ones(1201,100);


Matrix A wird im Verlauf des Codes noch berechnet und ist unter anderem eine Funktion von B. Dieser Code steht schon und funktioniert.

Ich möchte ihn aber folgendermaßen überarbeiten:

B soll schrittweise ab Zeile 601 verringert werden, sobald ab einer bestimmten Zeile (Bsp. ab Zeile 800) die Werte von A über 400 betragen und das solange bis die Werte der letzten Zeilen und der letzten Spalte (bpsw. Zeilen 1100 bis 1201 und Spalte 100) von A = 400 sind.

Matrix B sollte dann bspw. so aussehen (natürlich als 1201x100 Matrix):
300 300 300
300 300 300
299 299 299
298 298 298
297 297 297 (ab hier Bedingung erfüllt)
297 297 297
297 297 297

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.12.2019, 22:35     Titel:
  Antworten mit Zitat      
Hallo,

sorry, ich kann der Logik nicht folgen.
Zitat:
sobald ab einer bestimmten Zeile (Bsp. ab Zeile 800) die Werte von A über 400 betragen

Was soll das genau heißen? Dass ein Wert ab dieser Zeile über 400 ist? Oder alle? Diese Zeile eingeschlossen oder nicht?
Welcher Ausschnitt der Ergebnismatrix wird angezeigt?

Mein ehrlicher Eindruck ist, dass das Problem nur in einer für Dritte klar verständlichen Logik formuliert werden muss und die Umsetzung in MATLAB dann quasi trivial ist.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
rashica2103
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 12.12.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2019, 12:03     Titel:
  Antworten mit Zitat      
Zitat:

Mein ehrlicher Eindruck ist, dass das Problem nur in einer für Dritte klar verständlichen Logik formuliert werden muss und die Umsetzung in MATLAB dann quasi trivial ist.

Ja das glaube ich auch.

Zitat:
Dass ein Wert ab dieser Zeile über 400 ist? Oder alle?

Es sind definitiv alle Werte ab dieser Zeile über 400. Es soll geprüft werden, ob mindestens ein Wert über 400 ist. In den letzten Zeilen darf kein einziger Wert mehr über 400 sein.

Zitat:
Diese Zeile eingeschlossen oder nicht?

Ja, diese Zeile eingeschlossen.

Zitat:
Welcher Ausschnitt der Ergebnismatrix wird angezeigt?

Versteh diese Frage nicht.

Am Ende werden A und B über die Zeit geplottet, d.h. über alle Zeilen (jede Zeile stellt 1 s dar) und für A über die 1. 50. und 100. Spalte und bei B über die letzte 100. Spalte. Im Anhang ist der Plot.

A soll bspw. (hier im Plot ab der 400. s also 1000. Zeile) "langsam" wieder auf den Ursprungswert (hier 320) gebracht werden.

Da A eine Funktion von B ist, soll B bspw. hier ab Zeile 800/Sekunde 200 pro Sekunde/pro Zeile um 1 abnehmen, bis zumindest in A in den letzten Zeilen kein einziger Wert mehr über 320 ist.

Zusammenfassung:
- Prüfen, ob in A ab bspw. Zeile 1000 mindestens ein Wert über 400 ist
- Wenn ja: B ab bspw. Zeile 800 pro Zeile um 1,2,3,4,.... verringern (1.Zeile mit -1, 2. Zeile mit -2, 3. Zeile mit -3, usw..)
- Verringerung stoppen wenn in A in den letzten Zeilen (bspw. Zeile 1100 bis 1201) alle Werte = 400 sind


Tut mir echt leid, dass ich mich nicht so verständlich ausdrücken kann. Ich hoffe es ist jetzt einiges klarer geworden.

plot1.png
 Beschreibung:

Download
 Dateiname:  plot1.png
 Dateigröße:  20.32 KB
 Heruntergeladen:  204 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Es sind definitiv alle Werte ab dieser Zeile über 400. Es soll geprüft werden, ob mindestens ein Wert über 400 ist.

Wenn definitiv alle über 400 sind, wieso soll dann überhaupt etwas geprüft werden?! Sei's drum: mindestens ein --> any .

Zitat:
Versteh diese Frage nicht.

Du hast eine gewünschte Ergebnismatrix angegeben, aber nur einen Teil davon. Welchen Teil?

Zitat:
Prüfen, ob in A ab bspw. Zeile 1000 mindestens ein Wert über 400 ist

Code:
any(A(1000:end,:) > 400


Zitat:
Wenn ja: B ab bspw. Zeile 800 pro Zeile um 1,2,3,4,.... verringern (1.Zeile mit -1, 2. Zeile mit -2, 3. Zeile mit -3, usw..)

Code:
if any(A(1000:end,:) > 400
subtract = 1;
for k = 800:size(B,1)
B(k,:) = B(k,:) - subtract;
subtract = subtract + 1;
end


Zitat:
Verringerung stoppen wenn in A

In der Schleife geht es ja um B. Wie ist nun der Bezug zu B? Jedenfalls "irgendwas mit"
Code:
all(A(row,:) > 400

oder
Code:
while any(A(row,:) > 400


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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 - 2024 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.