gpt4 book ai didi

R 相当于 matlab 中的 diag(x,k)

转载 作者:行者123 更新时间:2023-12-04 06:11:17 30 4
gpt4 key购买 nike

我想,我有一个关于 diag 的两级问题在 R 和 matlab 中。

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)
}

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

最佳答案

在您回复 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<- 应该不会太难。配合它的功能。

关于R 相当于 matlab 中的 diag(x,k),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7745363/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com