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