Полагаю, у меня есть двухуровневый вопрос, относящийся к diag
в R и matlab.
1) Мне было интересно, был ли уже разработан способ доступа к различным диагоналям матриц в R, аналогичный тому, как это делается в Matlab (см. http://www.mathworks.com/help/techdoc/ref/diag.html).
2) Если текущей функции еще нет, как мой код можно улучшить так, чтобы он был похож на R diag
, где
* * 1010
В настоящее время мой код возвращает элементы по диагонали с учетом k, но как это можно записать так, чтобы, если он был указан как второй способ (см. Выше), он позволял мне вставлять значения по диагонали. В настоящее время для этого я использую diag.ind
, чтобы дать мне индексы, а затем использую эти индексы, чтобы вставить значения по диагонали k.
Вот код:
'diag.ind'<-function(x,k=0){
if(k=='') k=0
x<-as.matrix(x)
if(dim(x)[2]==dim(x)[1]){
stp_pt_r<-dim(x)[1]
stp_pt_c<-dim(x)[2]
}
if(ncol(x)> dim(x)[1]){
stp_pt_r<-dim(x)[1]
stp_pt_c<-stp_pt_r + 1
}
if(ncol(x)< dim(x)[1]){
stp_pt_c<-dim(x)[2]
stp_pt_r<-stp_pt_c+1
}
if(k==0){
r<-as.matrix(seq(1,stp_pt_r,by=1))
c<-as.matrix(seq(1,stp_pt_c,by=1))
ind.r<- cbind(r,c)
}
if(k>0){
r<-t(as.matrix(seq(1,stp_pt_r,by=1)))
c<-t(as.matrix(seq((1+k),stp_pt_c,by=1)))
ind<-t(rbind.fill.matrix(r,c))
ind.r<-ind[!is.na(ind[,2]),]
}
if(k<0){
k<-abs(k)
r<-t(as.matrix(seq((1+k),stp_pt_r,by=1)))
c<-t(as.matrix(seq(1,stp_pt_c,by=1)))
ind<-t(rbind.fill.matrix(r,c))
ind.r<-ind[!is.na(ind[,1]),]
}
diag.x<-x[ind.r]
output<-list(diag.x=diag.x, diag.ind=ind.r)
return(output)
}
Это немного неуклюже, и я чувствую, что, должно быть, заново изобретаю колесо. Заранее благодарим за понимание!