好吧,我问这个问题前面,但我得到了撞坏(理所当然),不指定任何东西,没有表现出之前尝试的迹象。 因此,让我再试一次..
我使用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()
函数在某种程度上与“如果不是对角线”的逻辑组合...但我迷路了。
是的,正如一些这里已经猜到了,我可能比很多人在这里更年轻,这是全新的......所以请把我在正确的方向。 真的很感谢您的帮助!
在R,该diag
方法具有两个功能。
它返回一个对角矩阵。 即
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
它可以构建一个对角矩阵。
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
使用外
可以使用以下来计算其描述的非对角线项的逻辑矩阵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
看来你已经得到了这个答案在回应您的原职 ...
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]