Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Matlab » Addition von Vektoren in einer for-Schleife mit max und min-Bedingungen
Autor
Schule Addition von Vektoren in einer for-Schleife mit max und min-Bedingungen
Max1997
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 23.02.2021
Mitteilungen: 3
  Themenstart: 2021-02-23

Hallo liebe Leute, ich habe folgende For-Schleife erstellt und komme leider nicht mehr weiter voran. Mein Ziel ist es den maximalen Wert aus A mit dem minimalen Wert aus B zu addieren. Dies soll solange passieren bis alle Zahlen aus A auf die minimalen Zahlen aus B draufaddiert sind. Das ist meine Zwischenlösung: A = [55 31 24 16 14 11 10 8 5]; B = [91 102 170 75 44]; for n = 1:length(A) B(B == min(B)) = min(B) + max(A) A = A(A < max(A)) end Das Ergebnis nach der sechsten Iteration lautet: B = [115 116 170 117 115]. Ab hier sollte die nächste Addition folgen und zwar der Zahl 10 aus Vektor A mit der 115 aus Vektor B. Es soll die 115 gewählt werden mit dem geringsten Abstand zur nächsten Zahl, somit die B(1,1). Wenn mehrere Werte minimal sind, dann muss einer der Werte gewählt werden, in Abhängigkeit von dem unmittelbaren Nachbarwert mit geringsten Unterschied. Wie kann man es realisieren? Damit das Ergebnis der siebten Iteration folgendermaßen aussieht und die for-Schleife fortgesetzt wird: B = [125 116 170 117 115].


   Profil
Kitaktus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.09.2008
Mitteilungen: 7146
Wohnort: Niedersachsen
  Beitrag No.1, eingetragen 2021-02-23

Die Funktionen max und min haben zwei Ausgabeparameter, den Wert des Maximums bzw. Minimums und die Stelle an der das Maximum bzw. Minimum angenommen wird. Gibt es mehrere solche Stellen, so wird eine davon ausgegeben. Das könnte man dann so umsetzen: \sourceon Matlab A = [55 31 24 16 14 11 10 8 5]; B = [91 102 170 75 44]; for n = 1:length(A) [wer_a,wo_a]=max(A); [wer_b,wo_b]=min(B); B(wo_b) = wer_b+wer_a; A(wo_a)=-inf; B end \sourceoff


   Profil
Max1997
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 23.02.2021
Mitteilungen: 3
  Beitrag No.2, vom Themenstarter, eingetragen 2021-02-24

Vielen Dank Kitaktus für deinen Vorschlag, es erfüllt den gewünschten Zweck! Wie kann ich die Funktion umgestalten, wenn mir je Vektor mehr als nur eine Zeile vorliegen? Hier bspw. die ursprünglichen Zeilenvektoren A und B jeweils ergänzt mit einer zusätzlichen Zeile: A = [55 31 24 16 14 11 10 8 5; 92 84 65 60 45 31 22 16 12]; B = [91 102 170 75 44; 124 45 83 60 38]; Die Berechnungen sollten weiterhin je Zeile erfolgen.


   Profil
Kitaktus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.09.2008
Mitteilungen: 7146
Wohnort: Niedersachsen
  Beitrag No.3, eingetragen 2021-02-25

Die Frage ist nicht klar genug. Werden die Einträge der ersten (zweiten) Zeile von A nur auf die erste (zweite) Zeile von B verteilt? Wenn ja, kommt es nur auf das Endergebnis an? Oder ist es z.B. wichitg zu wissen, wie das Zwischenergebnis nach 7 Schritten aussieht, bei denen fünfmal die Werte aus der ersten Zeile verrechnet wurden und zweimal die aus der zweiten? Wenn nein, dann sieht das etwa so aus (Code ist ungetestet!): \sourceon Matlab A = [55 31 24 16 14 11 10 8 5; 55 31 24 16 14 11 10 8 5]; B = [91 102 170 75 44; 11 102 30 35 64]; for m = 1:size(A,1) for n = 1:size(A,2) [wer_a,wo_a]=max(A(m,:)); [wer_b,wo_b]=min(B(m,:)); B(m,wo_b) = wer_b+wer_a; A(m,wo_a)=-inf; end end B \sourceoff


   Profil
Max1997
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 23.02.2021
Mitteilungen: 3
  Beitrag No.4, vom Themenstarter, eingetragen 2021-02-25

Hallo Kitaktus, ja, die Einträge der ersten (zweiten) Zeile von A werden nur auf die erste (zweite) Zeile von B verteilt! Somit soll eine Addition je Zeile erfolgen. Es kommt auf die Zwischenergebnisse je Schritt und auf das Endergebnis nach 9 Schritten an. Wenn es nicht umsetzbar ist eine Lösung mit Zwischenergebnissen zu entwickeln, dann wäre ich mit einer Lösung zufrieden, die das Endergebnis liefert.


   Profil
Kitaktus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.09.2008
Mitteilungen: 7146
Wohnort: Niedersachsen
  Beitrag No.5, eingetragen 2021-02-26

Ich frage nochmal konkreter: Wenn A so aussieht [6 2 1 5 4 3] und B so [1 2 3 6 5 4] ist dann _ein_ Schritt, die A(1,1) zu B(1,1) und A(2,1) zu B(2,3) zu addieren A = [- 3 2 - 4 1] B = [7 2 3 6 5 9] und im nächsten Schritt kommt A(1,2) zu B(1,2) und A(2,2) zu B(2,2)? Wenn ja, musst Du nur die beiden Schleifen vertauschen. Wenn es aber wichtig ist, dass zuerst A(1,1), dann A(2,1), A(2,2), A(2,3), A(1,2) und am Ende A(1,3) verarbeitet wird - man also nacheinander die jeweils größten Einträge der ganzen Matrix A verarbeitet, dann wird der Code etwas komplexer. Du müsstest erst die Zeilenmaxima bestimmen, dann das Maximum davon ermitteln und danach genau die Zeile behandeln, in denen das Maximum angenommen wird. \sourceon nameDerSprache A = [55 31 24 16 14 11 10 8 5; 55 31 24 16 14 11 10 8 5]; B = [91 102 170 75 44; 11 102 30 35 64]; for n = 1:size(A,1)*size(A,2) Zeilenmaxima=max(A'); %max arbeitet spaltenweise, deher die Invertierung [wer_m,m]=max(Zeilenmaxima); [wer_a,wo_a]=max(A(m,:)); [wer_b,wo_b]=min(B(m,:)); B(m,wo_b) = wer_b+wer_a; A(m,wo_a)=-inf; A, B, pause % nur damit man sieht, was passiert end B \sourceoff


   Profil
Max1997 hat die Antworten auf ihre/seine Frage gesehen.
Max1997 wird per Mail über neue Antworten informiert.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]