Рецензия

Инвариант
Гайдышев И.П. "Анализ и обработка данных. Специальный справочник"

Гм. До сих пор, я был лучшего мнения об издательстве "Питер".

Собственно, небрежность и отсутствие вычитки чувствуются во всем. Даже такое известное имя, как Hamming (метрика Хэмминга), написано с орфографической ошибкой.

Очевидно, что этот код - прилагаемый к книге - НИКОГДА не проверялся и НИКОГДА не компилировался.

Его просто невозможно скомпилировать - и из-за огромного количества типографских ошибок, и из-за отсутствия некоторых модулей, которые пришлось перепечатывать из DJVU-копии книги.

И вот, сделано, наконец, то, что давно должен был сделать если и не автор, то, хотя бы, рецензент или технический редактор - скомпилировано "это".

Вероятно, "это" следует поместить в какой-нибудь раздел "антипаттерны". Давненько я не видел такого похабного кода. К сожалению, глупостей понаписано столько, что нет никакой возможности выправить за один раз все, и нет никакой уверенности, что удастся заставить "это" работать. (Оно запускается и что-то считает, но я не пытался проверить правильность).

Судя по использованию 'cout' и перегруженных функций (тогда почему бы уж не Templates взамен Copy/Paste кода под каждый новый тип?), автору, вероятно, казалось, что он пишет на C++.

На самом деле, это код "не тянет" даже на Basic. Копирование массивов (POD-типа), например, выполняется в цикле. Взамен собственных функций сортировки, вероятно, следовало бы вызывать qsort(), но я поленился с этим разбираться.

Стиль форматирования лучше всего охарактеризовать как "отвратительный". Точнее сказать, он везде разный - никакого единого стиля нет - но везде отвратительный.

Внешне неразличимые символы - такие как 1 и l, например, всюду используются совместно. Исключая названия функций, ни одного осмысленного наименования код не содержит. Где-то пропущены скобки или точка с запятой - восстановил, где-то, возможно, что-то более существенное. В одном месте локальная в блоке переменная перекрывала другую с тем же именем, но из внешнего блока. Заметить удалось только благодаря разнице в типах (из-за ошибки инициализации). Сколько еще такого осталось незамеченным - бог знает.

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

Глупейшая экономия на всем - на пробелах, на пустых строках, на скобках (отличный тест на запоминание приоритетов всех операций). Декларации лепятся в одну строку, инициализации - в заголовок цикла, присваивания - в условие оператора if, переменные, за редким исключением, никогда не инициализируются, а иногда, даже, и не используются.

Автор, очевидно, не понимает ни разницы между целым и действительным типом переменных, ни разницы между целыми и указателями. Числа с плавающей точкой регулярно проверяются на точное равенство целому нулю, а если и инициализируются - то, опять же, целыми значениями.

Компилятор выдает множество предупреждений о возможном использовании переменных без инициализации.

Who care?

Про булевские переменные автор, вероятно, никогда не слышал, и всюду наглядно использует 0 и -1.

Ну, и за однобуквенные идентификаторы, надо просто давать срок.

Использование метода Якоби для вычисления собственных значений (вместо SVD), и инвертирование по Гауссу, а не по Пенроузу-Муру, мне кажется сомнительным.

Откровенно говоря, все это было бы проще написать заново.