2016-07-06 6 views
2

Ähnlich wie bei dieser Frage: Turn while loop into math equation?, habe ich die folgende verschachtelte Schleife, die ich in eine mathematische Gleichung zu konvertieren versuche, da ich dies in einem Format schreiben muss, das nicht wie Code aussieht. Ich glaube, ich werde eine Art Summengleichung brauchen. HierWie wird die Gleichung mit dekrementierender Indizierung in eine mathematische Gleichung mit Summation umgewandelt?

ist der Code:

int num = 0; 
for (int i = nr - 1; i >= 0; i--) { 
    for (int j = nc - 1; j >= 0; j--) { 
     ela[i][j] = num; 
     eha[i][j] = num + ea[i][j] - 1; 
     num += ea[i][j];      
    } 
} 

Ich weiß, dass Additionen von einer unteren Grenze und weiter zu einer höheren Grenze beginnen, so dass ich bin mir nicht ganz sicher, wie eine Summierung hier anzuwenden, da ich von einem Start höherer Index und weiter zu einem niedrigeren Index.

Ich bin nicht sicher, warum ich downvoted werde, da die Frage, die ich referenzierte, meiner sehr ähnlich ist, hat die gleichen Tags und wird 14-mal upvoted. Bitte kommentieren Sie unten, wenn ich meine Frage irgendwie verbessern kann.

Update:

konnte ich die Formel wie folgt aktualisieren:

nr = 50; 
nc = 10; 

num = sum[ea[i,j],i=0,nr-1,j=0,nc-1]; // correct based upon nr, nc and ea 
for (int i = 0; i < nr; i) { 
    for (int j = 0; j < nc; j++) { 
     num = num - ea[i,j]; 
     ela[i][j] = num; 
     eha[i][j] = num + ea[i,j] - 1;        
    } 
} 
+0

Was ist für "ELA" und "EHA" wichtig hier? Was ist "ea"? – LogicStuff

+1

@LogicStuff Ich denke, das sind diejenigen, die er als Funktionen ausdrücken möchte. – SirGuy

+0

@LogicStuff, ela und eha sind Variablen, die von dieser Schleife gesetzt werden. – Veridian

Antwort

1

Wenn ich Recht habe, können Sie den Effekt als

enter image description here

transkribieren Sie diese als Matrix beschreiben ela ist eine 2D-Suffix Summe der Matrix ea (für jedes Element, Summe aus die Elemente, die in der lexikographischen Anordnung folgen), während eha die Summe der Matrizen ela und ea abzüglich aller Einsen ist.

1

Wenn das Problem nur mit, wie die Summe auszudrücken, wenn Sie in die andere Richtung sind Looping, Sie können Sie den Code ändern:

int num = 0; 
for (int i = 0; i < nr; i++) { 
    for (int j = 0; j < nc; j++) { 
     ela[nr - i][nc - j] = num; 
     eha[nr - i][nc - i] = num + ea[nr - i][nc - j] - 1; 
     num += ea[nr - i][nc - j];      
    } 
} 

ich sage nicht, dass Sie Ihren Code dies ändern müssen, aber von hier aus sollte es offensichtlich sein, wie um dies zu ändern, um die Summennotation zu verwenden.

-1

Es ist schwierig, ohne Kontext zu sagen, aber der fragliche Code wird verständlicher, wenn Sie sich die Arrays als Vektoren vorstellen, die die Elemente in umgekehrter Reihenfolge aufzählen. Der folgende Code ist funktionell gleichwertig mit dem ursprünglichen, aber wahrscheinlich einfacher zu folgen.

// n.b. ela[nr - 1 - i][nc - 1 - j] == rela(nc * i + j); 
int &rela(int k) { return ela[nr - 1 - k/nc][nc - 1 - k % nc]; } 
int &reha(int k) { return elh[nr - 1 - k/nc][nc - 1 - k % nc]; } 
int &rea(int k) { return ea[nr - 1 - k/nc][nc - 1 - k % nc]; } 

for (int k = 0, sum = 0; k < nr * nc - 1; k++) { 
    rela(k) = sum; 
    sum += rea(k); 
    reha(k) = sum - 1; 
} 

Im Klartext, ist rela(k) die Teilsumme von rea Elemente 0 ... k-1 und reha(k) ist eins weniger als die Partialsumme rea Elemente 0 ... k (auch, rela(k) == reha(k - 1) + 1 für k > 0).

Technisch könnte diese Beschreibung zurück in Bezug auf die 2D-Arrays übersetzt werden, aber es wird ziemlich schnell unordentlich.

Verwandte Themen