Две ошибки в написании R-кода QR-декомпозиции с использованием метода Грамма-Шмидта и хотят знать, почему это пошло не так - PullRequest
0 голосов
/ 14 октября 2018

Я пишу код разложения QR вручную, используя ортогонализацию Грамма-Шмидта:

A<-cbind(c(2,-2,18),c(2,1,0),c(1,2,0),c(2,3,4))
gsm<-function(X){
m<-ncol(X)
n<-nrow(X)
# initialize Q and R
q<-matrix(0,m,n)
r<-matrix(0,n,n)
v<-matrix(0,m,n)
# initialize V
v[,1]<-X[,1]
q[,1]<-v[,1]/sqrt(sum(v[,1]^2))  
r[1,1]<-t(X[,1])%*%q[,1]
for (i in 2:n){
dv<-0
for (j in 1:(i-1)) {
r[j,i]<-t(X[,i])%*%q[,j]
dv<-dv+r[j,i]*q[,j]
}
v[,i]<-X[,i]-dv
q[,i]<-v[,i]/sqrt(t(v[,i])%*%v[,i])  
r[i,i]<-t(X[,i])%*%q[,i]
}
qrreport<-list("Q"=q,"R"=r)
return(qrreport)
}
gsm(A)

Однако код не работает и выдает ошибку: Ошибка в v [, 1] <- X [, 1]: количество заменяемых элементов не кратно длине замены </p>

И когда я заменяю А на матрицу 3 * 3: A <-cbind (c (2, -2,18), c(2,1,0), c (1,2,0)) и снова включите функцию, R выдаст мне новую ошибку: </p>

Recycling array of length 1 in vector-array arithmetic is deprecated.
  Use c() or as.vector() instead.
Recycling array of length 1 in vector-array arithmetic is deprecated.
  Use c() or as.vector() instead.
$ Q
           [,1]        [,2]       [,3]
[1,]  0.1097643  0.89011215 -0.4423259
[2,] -0.1097643  0.45314800  0.8846517
[3,]  0.9878783 -0.04855157  0.1474420

$R
         [,1]      [,2]       [,3]
[1,] 18.22087 0.1097643 -0.1097643
[2,]  0.00000 2.2333723  1.7964082
[3,]  0.00000 0.0000000  1.3269776

Я очень смущен, когда я делаю ошибки инадеюсь, кто-нибудь может помочь мне отладить.

1 Ответ

0 голосов
/ 14 октября 2018

Ваша матрица A имеет 3 строки и 4 столбца, поэтому в gsm() m - 4, а n - 3. Это означает, что v имеет 4 строки и 3 столбца, тогда как X, чтодействительно A, имеет только 3 строки.Когда v[, 1] <- X[, 1] пытается поместить 1-й столбец X в первый столбец A, вы получаете сообщение об ошибке, которое вы видели.

Чтобы отладить подобные вещи в RStudio, установите точку останова настрока v[, 1] <- X[, 1], которая вызвала ошибку, и посмотрите на различные элементы в выражении перед его выполнением.Если вы не используете RStudio, вы все равно можете установить точку останова с помощью функции setBreakpoint, но это намного больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...