Функция qr в R и Matlab

У меня есть вопрос о преобразовании функции Matlab в R, и я надеялся, что кто-то может помочь.

Стандартное QR-разложение, используемое как в matlab, так и в R, называется qr(). Насколько я понимаю, стандартный способ выполнения разложения qr на обоих языках:

Matlab: [Q,R] = qr(A) удовлетворяющий QR=A

Р:

z <- qr(A)
Q <- qr.Q(z)
R <- qr.R(z)

Оба из которых дают мне одинаковые результаты, к сожалению, это не то, что мне нужно. Что мне нужно, это:

Matlab: [Q,R,e] = qr(A,0), который производит разложение экономичного размера, в котором e является вектором перестановки, так что A(:,e) = Q*R.

Р: Понятия не имею

Я попытался сравнить [Q,R,E] = qr(A) с

z <- qr(A);
Q <- qr.Q(z);
R <- qr.R(z);
E <- diag(ncol(A))[z$pivot]

и результаты кажутся идентичными для переменных Q и E (но отличаются для R). Таким образом, в зависимости от определенных входов / выходов будут разные результаты (что имеет смысл).

Итак, мой вопрос: есть ли способ в R, который может имитировать это [Q,R,e] = qr(A,0) в Matlab?

Я попытался покопаться в функции matlab, но это ведет к долгому и мучительному пути бесконечных определений функций, и я надеялся на лучшее решение.

Любая помощь будет высоко ценится, и если я пропустил что-то очевидное, я прошу прощения.

1 ответ

Решение

Я думаю, что разница сводится к числовой библиотеке, лежащей в основе расчетов. По умолчанию R qr Функция использует (очень старые) процедуры LINPACK, но если я делаю

z <- qr(X,LAPACK=T)

затем R использует LAPACK, и результаты, похоже, совпадают с MATLAB (который, вероятно, также использует LAPACK снизу). В любом случае мы видим ожидаемые отношения с X:

z <- qr(X,LAPACK=F)
all.equal(X[,z$pivot], qr.Q(z)%*%qr.R(z), check.attributes=FALSE)
# [1] TRUE

z <- qr(X,LAPACK=T)
all.equal(X[,z$pivot], qr.Q(z)%*%qr.R(z), check.attributes=FALSE)
# [1] TRUE
Другие вопросы по тегам