R等于matlab中的diag(x,k)

时间:2011-10-12 19:21:25

标签: r matlab

我想,我在R和matlab中提到了diag的两个问题。

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

现在我的代码返回给定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)
}

这有点笨重,我觉得我必须重新发明轮子。提前感谢任何见解!

2 个答案:

答案 0 :(得分:3)

在回复Andrie之后,这可能会满足:

 exdiag <- function(mat, off) {mat[row(mat)+off == col(mat)]}
 x <- matrix(1:16, ncol=4)
 exdiag(x,1)
#[1]  5 10 15

我在想你想要一个可以分配或返回对角线或子对角线或超对角线矩阵的函数,这是构造函数:

subdiag <- function(vec, size, offset=0){ 
      M <- matrix(0, size, size)
      M[row(M)-offset == col(M)] <- vec
      return(M)}
> subdiag(1, 5, 1)
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    1    0    0    0    0
[3,]    0    1    0    0    0
[4,]    0    0    1    0    0
[5,]    0    0    0    1    0

只用两个参数调用,你会得到一个对角矩阵。您可以构造具有负偏移的超对角矩阵。如果这是你想要的构造函数,那么构造一个类似的subdiag<-函数就不应该太难了。

答案 1 :(得分:0)

在MATLAB中,将值x分配给A的对角线:

n = size(A,1);
A(1:n+1:end) = x

查找线性索引。

虽然,这可能不是你问的。