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