Если первую часть осилили, то со второй - разберетесь (я не могу посоветовать где почитать, так как везде криво). Там есть два алгоритма:
первый - давайте искать такую унитарную, чтобы если на нее слева и справа умножить, то занулится поддиагональный элемент. И так для всех поддиагональных. Ищем для простоты Гивенсом. Занулить - имеется ввиду итерационно сделать так, чтобы он стал меньше. Когда он станет меньше машинной точности - выбросить его нафиг.
Второй - давайте искать как занулить поддиагональный элемент, который желательно лежит где-то по середине этой матрицы. Если мы это сделаем, далее мы разобъем задачу на две подзадачи и далее рекуррентно.
Первый можно сделать так, что не потратить много дополнительной памяти, надо только два вектора размера этой двухдиагональной.
Вот со вторым - сложнее, тут приходится хранить много дополнительных кусочков, и все выливается в то, что или надо плотно умножить две полные матрицы (дорого!!!) или все-таки хранить порядка квадрата от размерности сингулярных чисел.
Попробуйте по этим идеям снова перечитать Трефентена, думаю, тогда будет существенно понятнее.
-- 27.11.2025, 23:57 --Хочется самому реализовать точный и достаточно быстрый вариант хотя бы для матриц общего вида.
отдельно прокомментирую то, что вы хотите быстрый вариант. Это не тривиально, если вы это хотите сделать на компьютерах, у которых скорость доступа к памяти отличается от скорости доступа к регистрам, а такие компьютеры - это практически все, кроме разве что какой-нибудь atmega. А вот тут нужно очень хорошо чувствовать BLASы, и постоянно держать в голове теорему старшего Воеводина про умножение больших матриц. Не зря сам код SVD в лапаке содержит сотни тысяч строк. То есть я могу советовать, и постараюсь помочь, но реально это очень не тривиально и быстрые алгоритмы не всегда получаются именно те, у которых минимальное число флопов.