[алгоритмическая задачка]тупняк

darin06

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

Sigma_x0 = np.zeros([ls*ls], complex)
for j in range(N):
for i in range(N):
Sigma_x0[i] += GFinv[(i+j)%N, i]

Кажется что все правильно, но в то же время сравнение на конкретном примере дает неверный результат.
Вобщем, кто что скажет?

vall

строки и столбцы не перепутал?

hwh2010

for i in range(N):
Sigma_x0[i] += GFinv[(i+j)%N, i]
мне кажется, что последнее i в нижней строке надо заменить на j. ну или первое. а то результат от j не зависит

yroslavasako

, что если элемент выходит за пределы текущей строки, то надо рассматривать элемент из начала следуещей строки.
             Sigma_x0[i] += GFinv[(i+j)%N, i] 

и где в твоём коде переход на следующую строку?

Sharp

если элемент выходит за пределы текущей строки, то надо рассматривать элемент из начала следуещей строки.
Я не понял вот этот момент: т.е. для нулевой строки просто суммируем строку, для первой — строку без первого элемента, но прибавляем первый элемент следующей т.е. второй строки, так? Как тогда обходиться с последней строкой, ее игнорировать?
Но если я понял правильно, тогда остается просто в нужные момент при суммировании увеличить номер строки, т.е.:

Sigma_x0[i] += GFinv[(i+j)%N, i + i+j)div N) ]

Ну и здесь опять же тонкий момент — нумерация с 0 или с 1? Если вдруг с 1, тогда надо еще думать как от (i+j)%N получить правильный индекс.

vall

элемент из начала следуещей строки.
угу. сразу не заметил

darin06

Нулевую строку складываем с первой:
00+11, 01+12,..., 0n-1+10
и так далее.

Sharp

Давай для наглядности на примере. Как понял я:
пусть есть матрица:

1 2 3
4 5 6
7 8 9

Для нее:

sum(0) = 1 + 2 + 3 = 6
sum(1) = 5 + 6 + 7 = 18
sum(2) = 9 + 1 + 2 = 12

Я правильно понял условие задачи?
Тогда мое решение выше надо еще чуть модифицировать:

Sigma_x0[i] += GFinv[(i+j)%N, (i + i+j)div N%N ]

darin06

нет, надо суммировать элементы строк "с верху в низ со сдвигом".

1 2 3
4 5 6
7 8 9
1+5+9 = 15, 2+6+7 = 15, 3+4+8 = 15

darin06

(i+j)%N
разве не делает этого?

lubanj

у тебя индексы от 0 до н-1 или все же от 1 до н?

darin06

индексы 0...N=ls*ls, индекс строк - i, j - индекс столбцов

lubanj

что означает эта конструкция в твоем языке программирования?
for j in range(N):
для всех j От 1до н или для всех j от 0 до н?
а нумерация в массивах в твоем языке с нуля идет или с 1?

okis

язык называется питон =)
индексация с 0

darin06

Да, это Python, "for i in range(N):" это цикл по переменной i от 0 до N-1.

Sharp

Ну если у тебя индекс по N включительно, т.е. N=2 для матрицы

1 2 3
4 5 6
7 8 9

тогда просто надо брать модуль не по N, а по (N+1). А так — в твоей формулировке твой остальной код правилен.

lubanj

в то же время сравнение на конкретном примере дает неверный результат.
пример и результат в студию

okis

> Вобщем, кто что скажет?
Я предлагаю воспользоваться отладчиком.

darin06

Пример показать сложно, потому что я проверяю это на матрице, полученной перед этим численно, и которая обладает "трансляционной инвариантностью", т.е. если сложить предложеным способом все ее строки и поделить на N, то получится первая строка (почти первая строка, поскольку матрица с небольшим шумом). Ну вот у меня такое сравнение не проходит, хотя если смотреть в текстовые файлы с этой матрицей, то там на первый взгляд все нормально в этом плане
За идеи и подсказки спасибо, я сейчас отдохну, сделаю выводы из того что тут написали, и проверю. О результатах отпишусь.

darin06

я конечно сейчас уже совсем запутался, но это явно не правильно

lubanj

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

july

Вот такое у меня работает:

def fancy_sum(m):
    nrows, ncols = m.shape
    out = np.zeros(ncols)
    for col in range(ncols):
     for row in range(nrows):
     out[col] += m[row, (row + col)%ncols]
    return out

m1 = array([[1, 2, 3], [4, 5, 6], [7, 8, 9])

fancy_sum(m1)
array([ 15., 15., 15.])

Это то что тебе нужно?

july

Чтобы было веселей:

def fancy_sum2(m):
nrows, ncols = m.shape
return [summ[row, (col+row)%ncols] for row in xrange(nrows
for col in xrange(ncols)]

hwh2010

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

july

Да. Поэтому и стоит иногда называть переменные для строк и столбцов соответствующими словами — чтобы сложнее было запутаться :)

darin06

Да, все правильно, в том что у меня написано, действительно перепутаны индексы строки и столбца.
Проблема пока еще остается в том, что я проверял на матрице обладающей более хитрой симметрией, поэтому результат сравнения среднего по строкам вычисленный предлагаемым способом с первой строкой был неверный. Сейчас вот сижу думаю как надо правильно суммировать. Спасибо , действительно, как только обозначил i за ri (row index) и j за ci (column index) сразу все прозрачней стало.

Sharp

А потом, недели через две, будешь смотреть на свой же код и пытаться понять, что это за ri и ci.
Может это Real Index и Complex Index... или right invariant и central invariant... или может что еще...
В общем, что тебе мешает назвать переменные row и column ? Длинное слово column — сократи до col, хотя если назвать column то это уже никаких разночтений не вызовет.

darin06

не вопрос, просто у меня такое обозначение можно скзать традиционное (много где использованно ну и комментарий можно оставить. Просто column у меня ассоцируется именно с колонкой, а column index - с номером колонки, вот и все.
Оставить комментарий
Имя или ник:
Комментарий: