我想,我在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)
}
这有点笨重,我觉得我必须重新发明轮子。提前感谢任何见解!
答案 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
查找线性索引。
虽然,这可能不是你问的。