R 基于另一个矩阵修改矩阵值而不使用循环或应用函数

R 基于另一个矩阵修改矩阵值而不使用循环或应用函数,r,matrix,adjacency-matrix,R,Matrix,Adjacency Matrix,我有两个矩阵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 换句话说,在矩阵S中,每一行代表一个图的顶点。每行中的值(例如ith)是连接到ith顶点的顶点的索引。矩阵A是图的邻接矩阵 问题:如何解决问题,即获取矩阵A,而不使用for循环或apply/s

我有两个矩阵
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
换句话说,在矩阵S中,每一行代表一个图的顶点。每行中的值(例如
i
th)是连接到
i
th顶点的顶点的索引。矩阵
A
是图的邻接矩阵

问题:如何解决问题,即获取矩阵
A
,而不使用for循环或apply/sapply/mapply等函数?最快的方法是什么

编辑:一个例子

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


我们可以使用“S”作为行/列索引来更改

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

A它不能按我想要的方式工作。在矩阵S中,每一行代表一个图顶点。每行中的值(例如,第i个)是连接到第i个顶点的顶点的索引。我会把它弄清楚并编辑这个问题。@treskov什么是你的输入“A”矩阵应该是一个邻接矩阵。你的解决方案的反例:
S@treskov如果你能用这个例子更新你的帖子,你会helpful@treskov我正在转置(
t
)对象,并检查转置后的元素上是否有任何1,然后使用
+
将其强制为二进制。在您的新示例中,第4列的索引在哪里?第一行的数字只有3,我假设,2,3意味着“A”将从0变为1,但为什么在没有数字的情况下,它会填充第四列index@akrun有一个填充,因为第4行第一列中有1,这意味着第4和第1个顶点已连接OK,那么更新可能有助于实现
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



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