如何使用 R 从矩阵 L 中删除对角线元素 (diagL)?我尝试使用以下内容:
subset(L, select=-diag(L)) or
subset(L, select=-c(diag(L)))
但是我得到了 0 个数字...
最佳答案
R 编程语言?我更喜欢 C,它更容易拼写。
一种方法是按照我喜欢的方式创建一个包含数字的矩阵:
a<-t(matrix(1:16,nrow=4,ncol=4))
看起来像:
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
[4,] 13 14 15 16
删除对角线上的值:
diag(a)=NA
结果是:
[,1] [,2] [,3] [,4]
[1,] NA 2 3 4
[2,] 5 NA 7 8
[3,] 9 10 NA 12
[4,] 13 14 15 NA
要真正删除这些值,而不仅仅是让它们消失,我们需要重新转换:
a<-t(matrix(t(a)[which(!is.na(a))],nrow=3,ncol=4))
结果是:
[,1] [,2] [,3]
[1,] 2 3 4
[2,] 5 7 8
[3,] 9 10 12
[4,] 13 14 15
这与我们在上面的 C 中得到的结果是一样的。
这有点迂回,但它得出了我认为正确的答案。我有兴趣看到比我更了解 R 的人提供的改进解决方案。
对作业的一些解释:
a<-t(matrix(t(a)[which(!is.na(a))],nrow=3,ncol=4))
!is.na(a)
为我们提供了一个包含 TRUE、FALSE 值的列表,其中元素已被清空。which(!is.na(a))
为我们提供了每个真实元素的下标列表。t(a)
转置矩阵,因为我们需要根据 #2 中的下标进行拉取。-
t(a)[which(!is.na(a))]
给我们一个缺少对角线 NA 值的数字列表。 -
matrix(t(a)[which(!is.na(a))],nrow=3,ncol=4)
将#4 中的列表转换为矩阵,这是我们想要的转置。 -
a<-t(matrix(1:16,nrow=4,ncol=4))
(整个事情)将 #5 转置为我们想要的形式并将其分配给a
变量。
这适用于 a<-t(matrix(11:26,nrow=4,ncol=4))
等情况.
关于从R中的矩阵中删除对角线元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18839090/