2011-10-12 88 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