Информация об изменениях

Сообщение Re[14]: 2D-Linq и оптимизация цифровых фильтров - 3 от 04.07.2018 12:57

Изменено 04.07.2018 13:06 Sinclair

Re[14]: 2D-Linq и оптимизация цифровых фильтров - 3
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Sinclair, Вы писали:


S>>Можно всё же в студию полное тело метода FourNeighborAverage?

S>>Можете, если хотите, сделать его generic с where T: Struct, IArray2d<T>.

V>Разумеется генерик, ради ж этого всё.

V>Без студии:
V>
V>void FourNeighborAverage<T>(T array) where T : struct, IArray2d<int>
V>{
V>    for(int y = 1, dy = array.DY - 1; y < dy; y++)
V>    for(int x = 1, dx = array.DX - 1; x < dx; x++)
V>            array[x, y] = array[x-1, y] + array[x+1, y] + array[x, y-1] + array[x, y+1];
V>}
V>

V>Что здесь "так" в сравнении с твоим вариантом?
Ну, во-первых, в этом коде — две ошибки.
1. Забыл поделить на 4.
2. Забыл, что array[x, y] будет прочитан на следующей итерации, а он к этому моменту уже испорчен присваиванием. Надо усреднять в другой массив.
Re[14]: 2D-Linq и оптимизация цифровых фильтров - 3
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Sinclair, Вы писали:


S>>Можно всё же в студию полное тело метода FourNeighborAverage?

S>>Можете, если хотите, сделать его generic с where T: Struct, IArray2d<T>.

V>Разумеется генерик, ради ж этого всё.

V>Без студии:
V>
V>void FourNeighborAverage<T>(T array) where T : struct, IArray2d<int>
V>{
V>    for(int y = 1, dy = array.DY - 1; y < dy; y++)
V>    for(int x = 1, dx = array.DX - 1; x < dx; x++)
V>            array[x, y] = array[x-1, y] + array[x+1, y] + array[x, y-1] + array[x, y+1];
V>}
V>

V>Что здесь "так" в сравнении с твоим вариантом?
Ну, во-первых, в этом коде — две ошибки.
1. Забыл поделить на 4.
2. Забыл, что array[x, y] будет прочитан на следующей итерации, а он к этому моменту уже испорчен присваиванием. Надо усреднять в другой массив.
V>Учитывая новый ref-return, можно попробовать пойти еще дальше:
V>
V>[cs]
V>interface IArray2d<T> {
V>    ...
V>    ref T this[int x, int y] { get; } // только геттер
V>}
V>...
V>unsafe void FourNeighborAverage(T array) where T : struct, IArray2d<int>
V>{
V>    int dx = array.DX;

V>    for(int y = 1, dy = array.DY - 1; y < dy; y++) {
V>        fixed(int* current = array[1, y])
V>        fixed(int* end = array[dx, y])
V>        fixed(int* it1 = array[0, y])
V>        fixed(int* it2 = array[2, y])
V>        fixed(int* it3 = array[1, y - 1])
V>        fixed(int* it4 = array[1, y + 1]) {
V>            int* c = current, _1 = it1, _2 = it2, _3 = it3, _4 = it4;
V>            while(c < end)
V>                *c++ = *_1++ + *_2++ + *_3++ + *_4++;
V>        }
V>    }
V>}
V>

Здесь добавлена ещё одна ошибка.
S>>Меня интересует не "индексер" (предоставленный, потенциально, библиотекой), а полный код, который должен писать прикладной программист.
V>А другой программист должен будет еще этот код читать, верно?
Совершенно верно. К примеру, сколько времени уйдёт у другого программиста на то, чтобы разобраться вот в этой лапше с fixed и найти в ней ошибку?