使用R创建整数的相似性矩阵
我有一个矩阵,对角线等于零,非对角线都等于一(单位矩阵的逆):使用R创建整数的相似性矩阵,r,matrix,R,Matrix,我有一个矩阵,对角线等于零,非对角线都等于一(单位矩阵的逆): mat1以下解决方案利用upper.tri和lower.tri来隔离上下三角矩阵。此外,它还利用序列创建所需的向量序列 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)] <
mat1以下解决方案利用upper.tri
和lower.tri
来隔离上下三角矩阵。此外,它还利用序列
创建所需的向量序列
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
n当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)
MakeMatrix怎么样:
genMat <- function(n){
mat <- outer(1:n,1:n,"-")%%n
tmp <- mat[lower.tri(mat)]
mat <- t(mat)
mat[lower.tri(mat)] <- tmp
mat
}
> genMat(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
编辑2
事实上,不需要使用模数,然后再使用矩阵,abs
可以很好地将原始矩阵定义为一行:
abs(outer(1:n,1:n,"-"))
所以
序列和较低的.tri()的genMat+1。不错的一个,尽管您应该使用m作为索引从输入向量中进行选择。没有任何东西可以保证OP会使用一个序列作为vec1…@Joris评论不错。我现在做了一个非常小的修改:使用sequence()作为所提供向量的索引。这应该适用于任何n和vec。我喜欢这种方法的简单性。谢谢!
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)
MakeMatrix <- function(n){
id <- abs(rep(1:n,n)-rep(1:n,each=n))
matrix(id,ncol=n)
}
MakeMatrix(7)
genMat <- function(n){
mat <- outer(1:n,1:n,"-")%%n
tmp <- mat[lower.tri(mat)]
mat <- t(mat)
mat[lower.tri(mat)] <- tmp
mat
}
> genMat(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
genMat2 <- function(vec){
n <- length(vec)
mat <- outer(1:n,1:n,"-")%%n
tmp <- mat[lower.tri(mat)]
mat <- t(mat)
mat[lower.tri(mat)] <- tmp
matrix(vec[mat+1],n,n)
}
> genMat2(c(0,2,4,3,9))
[,1] [,2] [,3] [,4] [,5]
[1,] 0 2 4 3 9
[2,] 2 0 2 4 3
[3,] 4 2 0 2 4
[4,] 3 4 2 0 2
[5,] 9 3 4 2 0
abs(outer(1:n,1:n,"-"))
genMat <- function(n){
abs(outer(1:n,1:n,"-"))
}
genMat2 <- function(vec){
n <- length(vec)
matrix(vec[abs(outer(1:n,1:n,"-"))+1],n,n)
}