在不使用循环或应用函数的情况下基于另一个矩阵修改矩阵值

Modifying matrix values based on another matrix without using a loop or apply function

我有两个矩阵 SA,我想根据 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