Rolf B: Berechnung/Logik

Beitrag lesen

Hallo Jo,

ja, die erste Version hab ich erstmal überschrieben, weil sie von der Antwort auf meine dann gestellte Frage abhing... Ich packe sie also wieder aus:

Du gehst also erstmal die erste Spalte durch. Wenn die Summierung zum Unterlauf führt, willst du die Zeilenvektoren herunter skalieren, die in der betrachteten Spalte negative Werte haben. Das ist, denke ich, am einfachsten, wenn du zunächst positive und negative Werte für die ganze Spalte getrennt addierst und danach schaust, ob du skalieren musst. Wenn ja, berechne den Faktor und skaliere die betroffenen Zeilen.

Dann machst du das gleiche mit Spalte 2. Problem ist, dass hier andere Zeilen die negativen Werte enthalten können, d.h. wenn du jetzt skalierst, machst du dir ggf. die Summe für Spalte 1 negativ. Das ignoriere erstmal. Gehe einfach alle Spalten durch.

Nach dem ersten Durchgang hast du keine sichere Lösung, bist ihr aber näher gekommen. Darum wiederholst du nun den Prozess, bis du nicht mehr skalieren musstest.

D.h. die nichtOk schleife muss die äußerste sein, und du solltest Funktionen verwenden, um die Lesbarkeit zu verbessern.

while (skaliereMatrix(e, M));

skaliereMatrix gibt true zurück wenn skaliert wurde.

function skaliereMatrix(Vector s, Matrix M) : bool {
  bool skaliert = false
  for (i) { /* alle Indexe von s bzw. M-Spalten */
    f = berechneFaktor(s[i], M[i]);
    if (f < 1) {
      skaliert = true;
      skaliereNegativeZeilen(i, f, M);
    }
  }
  return skaliert;
}

berechneFaktor macht die getrennte Addition und gibt stumpf 1 zurück, wenn nichts zu skalieren ist. Ansonsten den Skalierungsfaktor, der zwischen 0 und 1 liegen muss.

skaliereNegativeZeilen habe ich noch um einen Parameter i erweitert, weil diese Funktion ja wissen muss, in welcher Spalte sie nach negativen Werten schauen muss.

Das und skaliereNegativeZeilen zu implementieren schaffst Du bestimmt selbst, und die eigentlich Addition der Spaltenvektoren auf s kommt zum Schluss.

Rolf

--
sumpsi - posui - clusi