Forum:  Matlab
Thema: Addition von Vektoren in einer for-Schleife mit max und min-Bedingungen
Themen-Übersicht
Max1997
Neu
Dabei seit: 23.02.2021
Mitteilungen: 3
Themenstart: 2021-02-23 20:37

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].


 


Kitaktus
Senior
Dabei seit: 11.09.2008
Mitteilungen: 6826
Wohnort: Niedersachsen
Beitrag No.1, eingetragen 2021-02-23 21:33

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:
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


Max1997
Neu
Dabei seit: 23.02.2021
Mitteilungen: 3
Beitrag No.2, vom Themenstarter, eingetragen 2021-02-24 13:23

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.


Kitaktus
Senior
Dabei seit: 11.09.2008
Mitteilungen: 6826
Wohnort: Niedersachsen
Beitrag No.3, eingetragen 2021-02-25 08:53

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!):
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
 


Max1997
Neu
Dabei seit: 23.02.2021
Mitteilungen: 3
Beitrag No.4, vom Themenstarter, eingetragen 2021-02-25 09:43

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.


Kitaktus
Senior
Dabei seit: 11.09.2008
Mitteilungen: 6826
Wohnort: Niedersachsen
Beitrag No.5, eingetragen 2021-02-26 10:03

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.
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





Dieses Forumbeitrag kommt von Matroids Matheplanet
https://https://matheplanet.de

Die URL für dieses Forum-Thema ist:
https://https://matheplanet.de/default3.html?topic=252522=41003
Druckdatum: 2021-05-15 23:41