我想,我有一個兩級的問題,在R和matlab中提到diag
。在matlab中等價於diag(x,k)
1)我想知道是否有一種方法已經開發出來訪問R中的不同矩陣的對角線,類似於在Matlab中完成的方式(請參閱http://www.mathworks.com/help/techdoc/ref/diag.html)。
2)如果沒有已經是當前的功能如何可以我的代碼加以改進,使得其類似於將R diag
其中
diag(x = 1, nrow, ncol) # returns the values of the diagonal
diag(x) <- value # inserts values on the diagonal
目前我的代碼返回對角線上的給定ķ但如何元素可以這樣寫,以便如果按照第二種方式(上面)指定它允許我在對角線上插入值。目前爲此,我使用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)
}
這有點笨重,我覺得我必須重新發明輪子。預先感謝任何見解!
非常好,這是我正在尋找的,比我的代碼更簡單。謝謝! – ChrisC