问题描述
我有两个矩阵S
和A
,我想根据A
的值来修改S
的值。矩阵S
包含我要修改的矩阵A
的索引。例如
S <- matrix(c(2,3,1,2),nrow=3,byrow=TRUE)
[,1] [,2]
[1,] 2 3
[2,] 3 1
[3,] 1 2
结果矩阵A
为
[,2] [,3]
[1,] 0 1 1
[2,] 1 0 1
[3,] 1 1 0
换句话说,在矩阵S中,每一行都代表一个图形顶点。每行(例如第i
个)中的值是连接到第i
个顶点的顶点的索引。矩阵A
是图的邻接矩阵。
问题:如何解决问题,即获取矩阵A
,而不使用for循环或apply / sapply / mapply等函数?最快的方法是什么?
编辑:一个例子
S <- matrix(c(2,2,nrow=4,byrow=TRUE)
[,] 1 2
[4,] 1 2
结果应为:
[,3] [,4]
[1,] 0 1 1 1
[2,] 1 0 1 1
[3,] 1 1 0 0
[4,] 1 1 0 0
解决方法
我们可以使用'S'作为行/列索引来更改A中的值
A <- matrix(0,4,4)
A[cbind(c(row(S)),c(S))] <- 1
+(A|t(A))
# [,1] [,2] [,3] [,4]
#[1,] 0 1 1 1
#[2,] 1 0 1 1
#[3,] 1 1 0 0
#[4,] 1 1 0 0