2016-07-06 2 views
2

Как и к этому вопросу: Turn while loop into math equation?, у меня есть следующий вложенный цикл, который я пытаюсь преобразовать в математическое уравнение, поскольку мне нужно записать это в формате, который не похож на код. Я считаю, что мне понадобится какое-то уравнение суммирования.Как преобразовать уравнение с декрементирующей индексацией в математическое уравнение с суммированием?

Вот код:

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];      
    } 
} 

Я знаю, что Суммирование начинается с нижней границы и по-прежнему более высокий предел, так что я не совсем уверен, как применять суммирование здесь, так как я начать с более высокий индекс и продолжать снижение индекса.

Я не уверен, почему я получаю downvoted, поскольку вопрос, на который я ссылаюсь, очень похож на мой, имеет те же теги и поддерживается 14 раз. Прошу прокомментировать ниже, если я смогу улучшить свой вопрос.

Update:

Я был в состоянии изменить формулу следующим образом:

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

Для чего важны 'ELA' и' EHA'? Что такое 'ea'? – LogicStuff

+1

@LogicStuff Я думаю, что это то, что он хотел бы выразить как функции. – SirGuy

+0

@LogicStuff, ela и eha - переменные, заданные этим циклом. – Veridian

ответ

1

Если я прав, вы можете записать эффект как

enter image description here

Вы можете описать это как матрица ela являющейся 2D суффикса сумма матрицы ea (для каждого элемента, сумма элементы, которые следуют в лексикографическом порядке), а eha - сумма матриц ela и ea минус все.

1

Если проблема только с тем, как выразить сумму, когда вы зацикливание в другую сторону, вы может изменить свой код:

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];      
    } 
} 

Я не говорю, что вы должны изменить свой код, но здесь должно быть более очевидным, как чтобы изменить это, чтобы использовать нотацию суммирования.

-1

Трудно сказать без какого-либо контекста, но этот код становится более понятным, если вы думаете о массивах в виде векторов, перечисляющих элементы в обратном порядке, рядовые. Приведенный ниже код функционально эквивалентен исходному, но, возможно, легче следовать.

// 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; 
} 

В простом английском языке, rela(k) является частичной суммой rea элементов 0 ... k-1 и reha(k) на единице меньше, чем частичная сумма rea элементов 0 ... k (тоже, rela(k) == reha(k - 1) + 1 для k > 0).

Технически это описание может быть переведено обратно в терминах 2-мерных массивов, но оно становится довольно беспорядочным.

Смежные вопросы