【问题标题】:Modifying matrix values based on another matrix without using a loop or apply function基于另一个矩阵修改矩阵值而不使用循环或应用函数
【发布时间】:2020-11-10 22:47:57
【问题描述】:

我有两个矩阵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中,每一行代表一个图顶点。每行中的值(比如ith)是连接到ith 顶点的顶点索引。矩阵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

结果应该是:

     [,1] [,2] [,3] [,4]
[1,]    0    1    1    1
[2,]    1    0    1    1
[3,]    1    1    0    0
[4,]    1    1    0    0



【问题讨论】:

  • 在您的新示例中,第 4 列的索引在哪里?数字只到 3
  • 对于第一行,我假设,2, 3 意味着“A”会从 0 变为 1,但是为什么在没有索引时它会填充第 4 列
  • @akrun 有填充是因为第4行第一列有1,表示第4和第1个顶点相连
  • 好的,那么更新可能会有所帮助
  • 两次1, 2的目的是什么?

标签: r matrix adjacency-matrix


【解决方案1】:

我们可以使用'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

【讨论】:

  • 它不能按我想要的方式工作。在矩阵 S 中,每一行代表一个图顶点。每行(比如第 i 个)中的值是连接到第 i 个顶点的顶点的索引。我会让它更清楚并编辑问题。
  • @treskov 你的输入'A'矩阵是什么
  • A 应该是一个邻接矩阵。您的解决方案的反例:S &lt;- matrix(c(2,3,3,1,1,2,1,2),nrow=4, byrow=TRUE)
  • @treskov 如果您可以使用示例更新您的帖子,将会很有帮助
  • @treskov 我正在转置 (t) 对象并检查转置后的元素上是否有任何 1,然后使用 + 将其强制转换为二进制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2016-11-17
  • 1970-01-01
  • 2021-10-19
  • 2021-11-30
相关资源
最近更新 更多