svv писал(а):
(чем не усреднение?), то была бы возможна такая оптимизация: сначала обработать столбцы фильтром
![$a$ $a$](https://dxdy-01.korotkov.co.uk/f/4/4/b/44bc9d542a92714cac84e01cbbb7fd6182.png)
, затем строки фильтром
![$b$ $b$](https://dxdy-01.korotkov.co.uk/f/4/b/d/4bdc8d9bcfb35e1c9bfb51fc69687dfc82.png)
.
Во блин! А я до этого тоже допер! Только я соответствующей терминологии не знаю.
![Sad :-(](./images/smilies/icon_sad.gif)
Поэтому смогу объяснить простым языком
![Smile :-)](./images/smilies/icon_smile.gif)
То есть вместо
![$m_{ij}:= km_{ij}+l(m_{i-1j}+m_{i+1j}+m_{ij-1}+m_{ij+1})$ $m_{ij}:= km_{ij}+l(m_{i-1j}+m_{i+1j}+m_{ij-1}+m_{ij+1})$](https://dxdy-01.korotkov.co.uk/f/c/3/5/c355fcd54530d0741fd7c9ccd2b6e91782.png)
делается 2 итерации:
сначала
![$m_{ij}:= Am_{ij}+B(m_{i-1j}+m_{i+1j})$ $m_{ij}:= Am_{ij}+B(m_{i-1j}+m_{i+1j})$](https://dxdy-01.korotkov.co.uk/f/4/7/7/4773f5e0e9d27ad4c6ef60b5e0f7963382.png)
, а потом
![$m_{ij}:= Am_{ij}+B(m_{ij-1}+m_{ij+1})$ $m_{ij}:= Am_{ij}+B(m_{ij-1}+m_{ij+1})$](https://dxdy-01.korotkov.co.uk/f/4/7/d/47d9bb52d1d6e60a19afb35725b8255a82.png)
. Это равносильно общей формуле
![$m_{ij}:= km_{ij}+l(m_{i-1j}+m_{i+1j}+m_{ij-1}+m_{ij+1}) + r(m_{i-1,j-1}+m_{i+1,j-1}+m_{i+1,j-1}+m_{i+1,j+1})$ $m_{ij}:= km_{ij}+l(m_{i-1j}+m_{i+1j}+m_{ij-1}+m_{ij+1}) + r(m_{i-1,j-1}+m_{i+1,j-1}+m_{i+1,j-1}+m_{i+1,j+1})$](https://dxdy-04.korotkov.co.uk/f/b/7/2/b72c9747f78e3a10dcb95d2d0fe1650a82.png)
, где
![$r \neq 0$ $r \neq 0$](https://dxdy-04.korotkov.co.uk/f/b/c/c/bcc1f99b82ca48d6b3fe0034bd487a3182.png)
, но очень мало (т.е. мы добавили в сумму не только смежные ячейки, но и смежные по диагонали, но с очень маленьким весом). Если я правильно угадал смысл задачи, это изменение формулы должно быть несущественно.
Параметры
![$A,B$ $A,B$](https://dxdy-02.korotkov.co.uk/f/9/1/d/91daf49251530f97b200e0d037770c1182.png)
нужно подобрать (в частности
![$A^2 = k = \frac{1}{2}$ $A^2 = k = \frac{1}{2}$](https://dxdy-03.korotkov.co.uk/f/e/3/2/e3278b7b819c2041075a382814a89c9b82.png)
), но за
![$O(1)$ $O(1)$](https://dxdy-02.korotkov.co.uk/f/1/e/2/1e2f931ee6c0b8e7a51a7b0d123d514f82.png)
операций. Тогда каждую матрицу можно пересчитать, выделяя не
![$3n$ $3n$](https://dxdy-01.korotkov.co.uk/f/c/e/0/ce0fd5ce4c3daccc9742067d69bac5aa82.png)
, а всего
![$3$ $3$](https://dxdy-02.korotkov.co.uk/f/5/d/c/5dc642f297e291cfdde8982599601d7e82.png)
новых переменных (в 1-й части пересчитываются отдельно строки - нужно помнить 2 старых значения + еще одно, в второй части - столбцы - итого
![$2 \cdot 2 \cdot 3n^2$ $2 \cdot 2 \cdot 3n^2$](https://dxdy-04.korotkov.co.uk/f/b/7/a/b7aa2bd75188201ee5a77fd7cbd3c56a82.png)
присваиваний, что, конечно, хуже). Можете попробовать. Сильно хуже точно не будет. Код будет тоже не сильно сложный.