在不使用循环或套用功能的情况下,根据另一个矩阵修改矩阵值

问题描述

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