在R(希望更好的问这个时间)[重复]的矩阵代替非对角元素(Replacing non-diagona

2019-10-18 03:45发布

这个问题已经在这里有一个答案:

  • 如何更换为矩阵非对角线元素? 6个回答

好吧,我问这个问题前面,但我得到了撞坏(理所当然),不指定任何东西,没有表现出之前尝试的迹象。 因此,让我再试一次..

我使用R,和我有一个463✕463矩阵。 我想这样做是零,以取代比对角线之外的其它所有元素(X 11,X 22,X 33,...,X JJ)。

例如,我想:

[1 4 5
 2 3 5
 3 9 8]

成为:

[1 0 0
 0 3 0
 0 0 8]

当我使用diag()函数,它只是给我的对角线值的列向量。 我想我可以使用replace()函数在某种程度上与“如果不是对角线”的逻辑组合...但我迷路了。

是的,正如一些这里已经猜到了,我可能比很多人在这里更年轻,这是全新的......所以请把我在正确的方向。 真的很感谢您的帮助!

Answer 1:

在R,该diag方法具有两个功能。

  1. 返回一个对角矩阵。 即

     m <- matrix(1:9, ncol=3) m # [,1] [,2] [,3] # [1,] 1 4 7 # [2,] 2 5 8 # [3,] 3 6 9 diag(m) # [1] 1 5 9 
  2. 它可以构建一个对角矩阵。

     diag(1:3) # [,1] [,2] [,3] # [1,] 1 0 0 # [2,] 0 2 0 # [3,] 0 0 3 

所以你的情况,从现有的矩阵中提取对角线并将其提供给diag

diag(diag(m))
#      [,1] [,2] [,3]
# [1,]    1    0    0
# [2,]    0    5    0
# [3,]    0    0    9


Answer 2:

使用外

可以使用以下来计算其描述的非对角线项的逻辑矩阵n × n矩阵:

outer(1:n, 1:n, function(i,j) i!=j)

适用于您的示例:

> m <- matrix(c(1,2,3,4,3,9,5,5,8),ncol=3)
> m
     [,1] [,2] [,3]
[1,]    1    4    5
[2,]    2    3    5
[3,]    3    9    8
> m[outer(1:3, 1:3, function(i,j) i!=j)] <- 0
> m
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    3    0
[3,]    0    0    8

使用三角形

一种可能的替代方案将两个三角形的对角线上的任一侧相结合。 在这种情况下,可以使用矩阵m本身作为输入的大小来确定。

upper.tri(m) | lower.tri(m)

适用于你的使用情况:

> m[upper.tri(m) | lower.tri(m)] <- 0

看来你已经得到了这个答案在回应您的原职 ...



Answer 3:

m[ col(m)==row(m) ] <- 0

> m <- matrix(1:9, 3)
> m[ col(m)==row(m) ]
[1] 1 5 9
> m[ col(m)!=row(m) ] <- 0
> m
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    5    0
[3,]    0    0    9


文章来源: Replacing non-diagonal elements in a matrix in R (hopefully a better asked this time) [duplicate]
标签: r replace