Я в настоящее время пытаюсь дешево вычислить оценку хорошего ранга для матрицы . Поэтому я вычисляю разложение QR-кода с помощью Columnt, используя
[Q,R,E]=qr(A)
в Matlab. Я оцениваю ранг используя
tol = size(A,n)*eps*norm(A,'fro');
r = sum(abs(diag(R))>tol)
Это прекрасно работает, и график по всем диагональным элементам R выглядит следующим образом:
Если перенести весь алгоритм на C / Fortran, то я заменяю [Q, R, E] = qr (A), используя DGEQP3 из LAPACK, который также вычисляет столбец, развертывающий декомпозицию QR. Но если я использую ту же оценку для ранга, я в основном получаю что-то не так. Тот же график для созданного из DGEQP3, выглядит так
Матрица ввода одинакова для обоих экспериментов.
Теперь у меня вопрос, на какую функцию LAPACK опирается колонка, поворачивающая QR-разложение от Matlab?
Спасибо за любую помощь, Грису
Изменить: DGEQPF дает тот же неправильный результат.
Edit2:
- Входная матрица плотная и построена какE + s i g n ( E , F )
- доступно здесь: http://www-e.uni-magdeburg.de/makoehle/A.mtx.gz (формат MatrixMarket)
- Неправильно : http://www-e.uni-magdeburg.de/makoehle/R_wrong.mtx.gz
- Я использовал LAPACK 3.4.0 с OpenBlas / GotoBLAS (64 бит)
- Matlab 7, 2007b, 2010b Linux 32bit
Edit3: - Используя GDB, я обнаружил, что Matlab 2010b вызывает DGEQP3: # 3 0xaa46ce2f в dgeqp3_ () из /usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../. ./bin/glnx86/mllapack.so Почему я получаю неправильный результат, используя LAPACK (3.4.0 включает исправления, упомянутые в Рабочей записке 176)?
Ответы:
Здесь есть две проблемы:
Плотный или разреженный?
DGEQP3
[Q,R,E] = qr(A)
У вас тот же программный стек, что и во внутренних библиотеках MATLAB?
Вероятно, нет, что может быть одной из причин, почему вы получаете разные результаты.
Я столкнулся с этой проблемой, когда проводил модульное тестирование библиотеки, в которой использовалась QR-факторизация. Я использовал MATLAB для создания прототипа своей работы и получил результаты, отличные от LAPACK или NumPy. Насколько я могу судить, поскольку MathWorks не позволяет легко найти эту информацию, MATLAB использует версию LAPACK не ранее версии 3.1.1 и библиотеку Intel MKL BLAS (для Windows, Intel Mac и Linux) версии 9.1. или выше (см. здесь ). Я не смог ничего найти о версии использования SuiteSparse MATLAB. Покопавшись в Интернете или просмотрев библиотечные файлы для вашей системы, вы сможете найти дополнительную информацию. Вы можете попробовать изменить библиотеки, на которые ссылается MATLAB, чтобы иметь возможность сравнивать с теми же библиотеками в разных пакетах программ; Эрик Чу обеспечивает хорошую рецензиюэто показывает, по крайней мере, как вы можете заменить библиотеку BLAS MATLAB своей собственной (конечно, вы делаете это на свой страх и риск). Он предполагает, что вы можете сделать то же самое с LAPACK. Может даже оказаться возможным заменить версию SuiteSparse, которую использует MATLAB, вашей собственной версией.
В итоге я использовал NumPy для создания прототипа моих результатов для факторизации QR, потому что он использует системные библиотеки BLAS и LAPACK. NumPy и SciPy не являются заменой MATLAB, так как обеим библиотекам не хватает функциональности MATLAB, но для этой конкретной задачи линейной алгебры Python + NumPy + SciPy + Matplotlib должен работать хорошо.
источник
internal.matlab.language.versionPlugins.blas
иinternal.matlab.language.versionPlugins.lapack
получить версии BLAS и LAPACKСм. Страницу Лесли Фостер о программном обеспечении, раскрывающем рейтинг . См. Также эту рабочую записку LAPACK, в которой анализируются сбои в выявлении ранга QR
xGEQP3
.Вы сможете узнать, какие процедуры использует MATLAB, установив точки останова в отладчике и изучив стек. Последнее, что я посмотрел, по общему признанию, несколько лет назад, MATLAB использовал разделяемые библиотеки, и в этом случае имена символов не могут быть удалены, поэтому вы увидите имена функций в стеке вызовов (но не аргументы, потому что они определенно не сохраняют отладочную информацию).
источник
xGEQP3
Алгоритм не является полностью безопасным для выявления ранга. Если вы хотите гарантировать, что вы получите правильный результат, вам следует использовать SVD или более безопасный QR-код, такой какxGEQPX
илиxGEQPY
. Нельзя ожидать, что нестабильный алгоритм выдаст одинаковый результат на разных архитектурах или в разных реализациях (возможно, MATLAB использует более старый LAPACK).