Как стать автором
Обновить

Комментарии 17

Я уж подумал что будут разбирать почему тривиальное транспонирование работает медленно и как его написать быстро, а оказалось что статья про B[i, j] = A[j, i].

Эта статья рассчитана на совсем новичков, поэтому здесь и не рассматриваются вопросы быстродействия. Однако, я учту.
Я уж подумал что будут разбирать почему поворот на произвольный угол работает медленно и как компенсировать искажения, а оказалось что статья про B[i, j] = A[j, i]. (простите не удержался)

Я уж подумал что будут разбирать, как можно эффективно поворачивать изображения с помощью векторных инструкций (SSE, AVX, AVX512) и нюансов работы кэша и сравнивать реализацию, например, с Intel MKL, а оказалось что статья про B[i, j] = A[j, i]. (простите меня тоже)

Простите, я не в тренде, но я для начала хотя бы думал, что автор понимает, почему в двумерном массиве "две звёздочки". Но нет, у автора "двумерный массив лежит в памяти одним блоком". Нет. В общем случае, не лежит.

Не всё так однозначно. Если двухмерный (многомерный в в общем случае) массив объявлен так, как это показано в статье, то он однозначно «лежит в памяти одним блоком».

Но в этом случае, вот это
Зная второй вариант, [skipped]. Например, он может быть полезен, когда нужно избавиться от лишних звездочек от указателей на указатели на указатели.

совершенно неправильно. «Указатели на указатели на указатели» появляются только в том случае, когда многомерный массив размерности n реализуется с помощью массива указателей на массивы с размерностью n-1. И, да, в этом случае данные массива будут разбросаны по памяти. Обычно это бывает при создании многомерного массива в куче при размерах массива, неизвестных на этапе компиляции. Хотя и в этом случае, если чуть-чуть напрячься и заморочиться с адресной арифметикой, можно написать класс, реализующий многомерный массив, данные которого будут лежать в куче единым блоком.

Ну так вот поэтому я и написал "в общем случае". А у автора двумерные массивы лежат одним блоком. Мой комментарий как раз про то, что не всё так однозначно.

Я понимаю, что двумерный динамический массив с «двумя звёздочками» состоит из блоков в произвольном месте. Но это не тема статьи. Тема статьи — принцип простейших алгоритмов. То, во что часто упираются новички
НЛО прилетело и опубликовало эту надпись здесь
Примечание: создать массив размерностью высоты и ширины реального изображения на стеке не выйдет. Только на куче с помощью оператора new.

Хм, а функция alloca тогда что делает?

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

Вам шашечки или ехать? AVX-интринсиков тоже нет в стандарте C++, а их почему-то используют.


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

Да, с помощью C++ добиться высокой производительности, но можно и выстрелить в ногу.

Я уж подумал, что будут разбирать почему важна локальность памяти, методы inplace транспонирования и почему может быть эффективнее пройти по матрице несколько раз чем делать транспонирование за один проход, а оказалось что статья про B[i, j] = A[j, i]. (тоже не удержался)
Простите, это статья про A[i, j] = B[j, i] или B[i, j] = A[j, i]?
Меня аж ностальгия пробила.

Выкопал старые исходники (а то вдруг память подводит), примерно 93-го года сочинения. Была у меня там библиотека для работы с матрицами. И таки да, адресная арифметика, переопределение операторов и операции типа транспонирования… Помню, поражал препода лабораторкой, где в main было ((A+B)*C).print(); в те времена, когда новички писали это всё многосложными циклами.

К чему это я? Даже в те лохматые коды то, что описано автором, преподавалось в школе (пусть и не в каждой), как азы, в чистом виде не применимые в нормальной разработке.
И если уж у сферических новичков возникают проблемы с массивами, то не надо показывать циклы на уровне школьной арифметики. Им это не поможет.
Хороший комментарий, но я вас разочарую — не во всех школах преподают информатику. Меня в школе абсолютно не учили не информатике, ни программированию на протяжении 3 лет. Всё приходилось самому.
преподавалось в школе (пусть и не в каждой), как азы, в чистом виде не применимые в нормальной разработке.

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

И, если уж начинать с азов, то не с этих. Совсем новичка тут много собьёт с толку.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории