Сообщение 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>Что здесь "так" в сравнении с твоим вариантом?
Ну, во-первых, в этом коде — две ошибки.
1. Забыл поделить на 4.
2. Забыл, что array[x, y] будет прочитан на следующей итерации, а он к этому моменту уже испорчен присваиванием. Надо усреднять в другой массив.
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>Что здесь "так" в сравнении с твоим вариантом?
Ну, во-первых, в этом коде — две ошибки.
1. Забыл поделить на 4.
2. Забыл, что array[x, y] будет прочитан на следующей итерации, а он к этому моменту уже испорчен присваиванием. Надо усреднять в другой массив.
V>Учитывая новый ref-return, можно попробовать пойти еще дальше:
V>
Здесь добавлена ещё одна ошибка.
S>>Меня интересует не "индексер" (предоставленный, потенциально, библиотекой), а полный код, который должен писать прикладной программист.
V>А другой программист должен будет еще этот код читать, верно?
Совершенно верно. К примеру, сколько времени уйдёт у другого программиста на то, чтобы разобраться вот в этой лапше с fixed и найти в ней ошибку?
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 и найти в ней ошибку?