2011-10-12 71 views
2

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

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

回答

0

在MATLAB中,以x分配值,以对角线的A

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

查一查线性索引。

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

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 

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

+0

非常好,这是我正在寻找的,比我的代码更简单。谢谢! – ChrisC