根据R中另一矩阵给定的位置更改一个矩阵中的元素

coo*_*lsv 0 for-loop r symmetric matrix

比方说,我有一个对称矩阵A,例如

> A <- matrix(runif(16),nrow = 4,byrow = T)
> ind <- lower.tri(A)
> A[ind] <- t(A)[ind]
> A
          [,1]      [,2]      [,3]       [,4]
[1,] 0.4212778 0.6874073 0.1551896 0.46757640
[2,] 0.6874073 0.5610995 0.1779030 0.54072946
[3,] 0.1551896 0.1779030 0.9515304 0.79429777
[4,] 0.4675764 0.5407295 0.7942978 0.01206526
Run Code Online (Sandbox Code Playgroud)

我也有一个4 x 3矩阵B,给出矩阵的特定位置A,例如:

> B<-matrix(c(1,2,4,2,1,3,3,2,4,4,1,3),nrow=4,byrow = T)
> B
      [,1] [,2] [,3]
[1,]    1    2    4
[2,]    2    1    3
[3,]    3    2    4
[4,]    4    1    3
Run Code Online (Sandbox Code Playgroud)

B矩阵表示的下列位置A(1,1), (1,2), (1,4), (2,2), (2,1), (2,3), (3,3), (3,2), (3,4), (4,4), (4,1), (4,3)

我想更改A不在指定位置的值B,用代替Inf。我想要的结果如下:

          [,1]      [,2]      [,3]       [,4]
[1,] 0.4212778 0.6874073       Inf 0.46757640
[2,] 0.6874073 0.5610995 0.1779030        Inf
[3,]       Inf 0.1779030 0.9515304 0.79429777
[4,] 0.4675764       Inf 0.7942978 0.01206526
Run Code Online (Sandbox Code Playgroud)

如何快速避免for循环(我能够编写代码)?我见过很多类似的帖子,但是没人给我我想要的。谢谢!

Dan*_*n Y 5

您想要做类似于矩阵子集(例如P[Q])的操作,除了不能在矩阵子集中使用负索引(例如P[-Q]不允许使用)。这是一种解决方法。

将要保留的元素存储A在2列的矩阵中,其中每行是的坐标A

Idx <- cbind(rep(1:4, each=ncol(B)), as.vector(t(B)))
Run Code Online (Sandbox Code Playgroud)

创建一个所有值均为的矩阵Inf,然后覆盖要从中“保留”的值A

Res <- matrix(Inf, nrow=nrow(A), ncol=ncol(A))
Res[Idx] <- A[Idx]
Run Code Online (Sandbox Code Playgroud)

结果

Res
#          [,1]        [,2]        [,3]       [,4]
#[1,] 0.9043131 0.639718071         Inf 0.19158238
#[2,] 0.6397181 0.601327568 0.007363378        Inf
#[3,]       Inf 0.007363378 0.752123162 0.61428003
#[4,] 0.1915824         Inf 0.614280026 0.02932679
Run Code Online (Sandbox Code Playgroud)