我是整个编程和编码的新手,目前正在学校里学习R作为我的统计认证的一部分。
我们被要求创建一个名为'mat'的10 x 10矩阵,其中包含对角线上的数字1和非对角线上的0。
我使用以下方法完成了此操作:
mat<-diag(10)
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 0 0 0 0 0 0 0 0 0
[2,] 0 1 0 0 0 0 0 0 0 0
[3,] 0 0 1 0 0 0 0 0 0 0
[4,] 0 0 0 1 0 0 0 0 0 0
[5,] 0 0 0 0 1 0 0 0 0 0
[6,] 0 0 0 0 0 1 0 0 0 0
[7,] 0 0 0 0 0 0 1 0 0 0
[8,] 0 0 0 0 0 0 0 1 0 0
[9,] 0 0 0 0 0 0 0 0 1 0
[10,] 0 0 0 0 0 0 0 0 0 1
然后我被要求划分矩阵的k x k块,其中k = 3,并且还具有这种身份结构,并描述了执行此操作的方式。
我只知道如何执行以下操作:
mat2<-mat[c(1,2,3),c(1,2,3)]
mat2
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
到目前为止我觉得这么好吗?然而,现在我真的卡住了,我不知道怎么回事,mat2我现在被要求用这样的矩阵替换mat(mat2)的块对角线部分:
[,1] [,2] [,3]
[1,] 1 .5 .25
[2,] .5 1 .5
[3,] .25 .5 1
我的教授也暗示,使用外部函数会使这更容易,我真的不知道我怎么能这样做,我尝试使用upper.tri和lower.tri函数,但我也不是也是成功的。
我非常感谢任何帮助。提前谢谢!
答案 0 :(得分:1)
如果准备好替换矩阵:
mat<-diag(10)
replacement <- matrix(c(1,.5,.25,.5,1,.5,.25,.5,1), nrow=3, byrow=T)
mat[c(1,2,3),c(1,2,3)] <- replacement
将它放入for循环以跨越整个对角线
for(idx in 1:8){
mat[c(idx,idx+1,idx+2),c(idx,idx+1,idx+2)] <- replacement
}
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1.00 0.50 0.25 0.00 0.00 0.00 0.00 0.00 0.00 0.00
[2,] 0.50 1.00 0.50 0.25 0.00 0.00 0.00 0.00 0.00 0.00
[3,] 0.25 0.50 1.00 0.50 0.25 0.00 0.00 0.00 0.00 0.00
[4,] 0.00 0.25 0.50 1.00 0.50 0.25 0.00 0.00 0.00 0.00
[5,] 0.00 0.00 0.25 0.50 1.00 0.50 0.25 0.00 0.00 0.00
[6,] 0.00 0.00 0.00 0.25 0.50 1.00 0.50 0.25 0.00 0.00
[7,] 0.00 0.00 0.00 0.00 0.25 0.50 1.00 0.50 0.25 0.00
[8,] 0.00 0.00 0.00 0.00 0.00 0.25 0.50 1.00 0.50 0.25
[9,] 0.00 0.00 0.00 0.00 0.00 0.00 0.25 0.50 1.00 0.50
[10,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.25 0.50 1.00