我有一个对角线等于零的矩阵和非对角线都等于1(单位矩阵的倒数):
mat1 <- matrix(c(0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0), 5, 5)
Run Code Online (Sandbox Code Playgroud)
我还有一个向量,它始终与矩阵的dims长度相同,并始终从零开始:
vec1 <- c(0,1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
使用这两个对象我想创建一个如下所示的矩阵:
mat2 <- matrix(c(0,1,2,3,4,1,0,1,2,3,2,1,0,1,2,3,2,1,0,1,4,3,2,1,0), 5, 5)
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 2 3 4
[2,] 1 0 1 2 3
[3,] 2 1 0 1 2
[4,] 3 2 1 0 1
[5,] 4 3 2 1 0
Run Code Online (Sandbox Code Playgroud)
我想要一个可以推广的操作,这样如果我有一个9到9的dims矩阵,和0:8的向量,我可以得到相同的结果.有关如何处理此问题的任何想法?
以下解决方案利用upper.tri并lower.tri隔离上下三角矩阵.此外,它还利用它sequence来创建所需的矢量序列.
n <- 9
vec <- (1:n)-1
m <- matrix(0, n, n)
m[lower.tri(m, diag=TRUE)] <- vec[sequence(n:1)] #### Edit
m <- t(m)
m[lower.tri(m, diag=TRUE)] <- vec[sequence(n:1)] #### Edit
m
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 1 2 3 4 5 6 7 8
[2,] 1 0 1 2 3 4 5 6 7
[3,] 2 1 0 1 2 3 4 5 6
[4,] 3 2 1 0 1 2 3 4 5
[5,] 4 3 2 1 0 1 2 3 4
[6,] 5 4 3 2 1 0 1 2 3
[7,] 6 5 4 3 2 1 0 1 2
[8,] 7 6 5 4 3 2 1 0 1
[9,] 8 7 6 5 4 3 2 1 0
Run Code Online (Sandbox Code Playgroud)
当vec1以零开头时,你可以这样做:
MakeMatrix <- function(x){
n <- length(x)
id <- abs(rep(1:n,n)-rep(1:n,each=n)) + 1
matrix(x[id],ncol=n)
}
MakeMatrix(vec1)
Run Code Online (Sandbox Code Playgroud)
所以没有必要在输入中使用mat1,因为那个实际上是多余的.你可以在函数中构造矩阵.
诀窍在于提供一系列id值以从向量中进行选择,然后将所有内容转换为矩阵.
编辑:如果你只是要使用序列,你也可以这样做:
MakeMatrix <- function(n){
id <- abs(rep(1:n,n)-rep(1:n,each=n))
matrix(id,ncol=n)
}
MakeMatrix(7)
Run Code Online (Sandbox Code Playgroud)