在不使用循环或应用函数的情况下基于另一个矩阵修改矩阵值
Modifying matrix values based on another matrix without using a loop or apply function
我有两个矩阵 S
和 A
,我想根据 S
的值修改 A
的值。矩阵 S
包含我想修改的矩阵 A
的索引。例如
S <- matrix(c(2,3,3,1,1,2),nrow=3, byrow=TRUE)
[,1] [,2]
[1,] 2 3
[2,] 3 1
[3,] 1 2
结果矩阵 A
将是
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 1 0 1
[3,] 1 1 0
换句话说,在矩阵S中,每一行代表一个图的顶点。每行中的值(比如第 i
个)是连接到第 i
个顶点的顶点的索引。矩阵A
是图的邻接矩阵。
问题:如何解决问题,即不使用for循环或apply/sapply/mapply等函数得到矩阵A
?最快的方法是什么?
编辑:一个例子
S <- matrix(c(2,3,3,1,1,2,1,2),nrow=4, byrow=TRUE)
[,1] [,2]
[1,] 2 3
[2,] 3 1
[3,] 1 2
[4,] 1 2
结果应该是:
[,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'作为row/column索引来改变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
我有两个矩阵 S
和 A
,我想根据 S
的值修改 A
的值。矩阵 S
包含我想修改的矩阵 A
的索引。例如
S <- matrix(c(2,3,3,1,1,2),nrow=3, byrow=TRUE)
[,1] [,2]
[1,] 2 3
[2,] 3 1
[3,] 1 2
结果矩阵 A
将是
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 1 0 1
[3,] 1 1 0
换句话说,在矩阵S中,每一行代表一个图的顶点。每行中的值(比如第 i
个)是连接到第 i
个顶点的顶点的索引。矩阵A
是图的邻接矩阵。
问题:如何解决问题,即不使用for循环或apply/sapply/mapply等函数得到矩阵A
?最快的方法是什么?
编辑:一个例子
S <- matrix(c(2,3,3,1,1,2,1,2),nrow=4, byrow=TRUE)
[,1] [,2]
[1,] 2 3
[2,] 3 1
[3,] 1 2
[4,] 1 2
结果应该是:
[,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'作为row/column索引来改变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