我想,我有一个两级的问题,在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