Яка відповідна функція LAPACK за Matlab [Q, R, E] = qr (A)?


12

Я в даний час намагаюся дешево обчислити оцінку хорошого рангу для матриці . Тому я обчислюю стовпчик, що розгортається QR, використовуючиА

[Q,R,E]=qr(A)

в Матлабі. Я оцінюю ранг використовуючиА

tol = size(A,n)*eps*norm(A,'fro'); 
r = sum(abs(diag(R))>tol)

Це добре працює, і сюжет над усіма діагональними записами R виглядає так: сюжет (сортування (abs (diag (R)), 1, '' спуск ''), 'r *')

Якщо весь алгоритм переносять на C / Fortran, я замінюю [Q, R, E] = qr (A) за допомогою DGEQP3 від LAPACK, який також обчислює стовпчик, що обертає QR-розкладання. Але якщо я використовую ту саму оцінку для ранжу, я здебільшого щось не так. Один і той же сюжет для виробляється з DGEQP3 R

Вхідна матриця точно однакова для обох експериментів.

Зараз у мене запитання, на яку функцію LAPACK покладається стовпчик, що обертає QR-розкладання від Matlab?

Дякую за будь-яку допомогу, Грисю

Редагувати: DGEQPF дає той самий неправильний результат.

Edit2:

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)?


Чи можете ви спровокувати ту саму поведінку меншою матрицею, якою ви могли б поділитися тут?
GertVdE

А

А

Грісу - я хотів би поглянути на твою матрицю. Однак посилання www-e.uni-magdeburg.de/makoehle/A.mtx.gz більше не активне (у поточний час, все одно). У вас є поточне посилання на матрицю? Дякуємо, Les Foster

@LeslieFoster - ласкаво просимо до scicomp!
Арон Ахмадія

Відповіді:


7

Тут є два питання:

  • А
  • У вас такий самий стек програмного забезпечення, що і внутрішні бібліотеки MATLAB?

Щільний чи розріджений?

АDGEQP3[Q,R,E] = qr(A)А

У вас такий самий стек програмного забезпечення, що і внутрішні бібліотеки MATLAB?

Напевно, ні, це може бути однією з причин, коли ви отримуєте різні результати.

Я зіткнувся з цим питанням під час тестування бібліотеки, яку я писав, яка використовувала QR-фактори. Я використовував MATLAB для прототипу своєї роботи і отримав інші результати, ніж використання LAPACK або NumPy. Наскільки я можу сказати, оскільки MathWorks не дозволяє легко знайти цю інформацію, MATLAB використовує версію LAPACK не раніше версії 3.1.1 та бібліотеку MKL BLAS від Intel (для Windows, Intel Mac та Linux) версії 9.1 або вище (див. тут ). Я не зміг знайти нічого про версію програми SuiteSparse MATLAB. Копаючись в Інтернеті чи переглядаючи бібліотечні файли для вашої системи, ви можете отримати додаткову інформацію. Ви можете спробувати змінити бібліотеки, на які посилається MATLAB, щоб можна було порівнювати з тими ж бібліотеками в різних програмних пакетах; Ерік Чу забезпечує гарне оформленнящо показує принаймні, як ви можете замінити бібліотеку BLAS MATLAB на власну (звичайно, ви робите це на свій страх і ризик). Він пропонує, що ви можете зробити те ж саме з LAPACK. Можливо, навіть можливо замінити версію SuiteSparse, яку MATLAB використовує, на вашу власну версію.

А=QRQR

Я в кінцевому підсумку використовував NumPy для прототипу моїх результатів для QR-факторизації, оскільки він використовує системні бібліотеки BLAS та LAPACK. NumPy та SciPy не є заміною для заміни MATLAB, оскільки дві бібліотеки разом не мають певної функціональності MATLAB, але для цієї конкретної задачі лінійної алгебри Python + NumPy + SciPy + Matplotlib повинна добре працювати.


Отримати той же стек програмного забезпечення, що і Matlab, неможливо. Використовувати інше середовище для прототипування теж не потрібно. Проблема полягає в тому, що код працює в Matlab правильно, але не в C.
MK aka Grisu

@Grisu: Я думаю, що було б дуже важко отримати той самий стек програмного забезпечення, окрім спроб встановити зв'язок у своїх бібліотеках. Мене бентежить те, як ви знаєте, що результат у MATLAB правильний, а результат у С неправильний. Це якась тестова матриця, яка має відомі властивості? Більше того, АронАхмадія правий; окрім тиражування архітектури та стеку програмного забезпечення, не можна очікувати отримання однакових результатів при нестабільному алгоритмі. Мені в основному сказали те саме на форумах MATLAB два роки тому.
Джефф Оксберрі

На мою думку, QR не є нестабільним. Я не можу безпосередньо перевірити, який розмір QR є правильним, але з ранжу та матриці Q я обчислюю проектор, і там я можу легко перевірити, чи добрі чи погані результати та той, який є з Matlab, хороший. Але я намагаюся зв’язатися з бібліотеками Matlab.
МК aka Grisu

@Grisu: Існує чітка різниця між хорошими та правильними результатами. Нещодавно я неправильно здійснив розрахунок, завдяки чому мої результати виглядали чудово. Тим не менше, підрахунок був неправильним, і правильний розрахунок зробив мої результати менш вражаючими (але, на щастя, ілюструє, що мої результати є правильними). Ви намагаєтеся обчислити ортогональний проектор чи косий проектор? (
Запитую,

1
@GeoffOxberry: fwiw, у моїй версії MATLAB я можу зателефонувати internal.matlab.language.versionPlugins.blasта internal.matlab.language.versionPlugins.lapackотримати версії BLAS та LAPACK
Amro

6

Дивіться сторінку Леслі Фостер про програмне забезпечення, що виявляє ранг . Дивіться також цю робочу записку LAPACK, що аналізує збої QR-кодуxGEQP3 .

Ви повинні бути в змозі дізнатися, якими процедурами користується MATLAB, встановивши точки відключення у відладчику та вивчивши стек. Востаннє я подивився, правда, кілька років тому, MATLAB використовував спільні бібліотеки, і в цьому випадку імена символів неможливо зняти, тому ви побачите імена функцій у стеку викликів (але не аргументи, оскільки це точно не зберігає інформацію про налагодження).


Сторінка програмного забезпечення для виявлення рангів не допомогла. Описана там процедура RRQR була першим, що я використовую в своїй ідеї, але вона дає навіть гірші результати, ніж ідея повороту стовпців.
МК aka Grisu

2
@Grisu - Це мало б вам допомогти. xGEQP3Алгоритм не є повністю безпечним для виявлення рангу. Якщо ви хочете гарантувати отримання правильного результату, слід використовувати SVD або безпечніший QR-код, наприклад, xGEQPXабо xGEQPY. Ви не можете очікувати, що нестабільний алгоритм поверне той самий результат у різних архітектурах або в різних реалізаціях (MATLAB, ймовірно, використовує старіший LAPACK).
Арон Ахмадія

Я знаю, що GEQP3 не виявляє рейтингу, але він дає більш правильні результати, ніж підпрограми RRQR. Використання SVD занадто дорого в моєму зовнішньому алгоритмі. Я також поговорю з одним з авторів LAWN-176, і він вважає, що помилка не покривається помилкою. Я також спробував DGEQPF / DGEQP3 від LAPACK 3.0.0 з тими ж результатами.
МК aka Grisu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.