|
Autor |
Addition von Vektoren in einer for-Schleife mit max und min-Bedingungen |
|
Max1997
Neu  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  Dabei seit: 11.09.2008 Mitteilungen: 7142
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  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  Dabei seit: 11.09.2008 Mitteilungen: 7142
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  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  Dabei seit: 11.09.2008 Mitteilungen: 7142
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. |
|
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]
|