从R中的矩阵中删除对角线元素

标签 r matrix diagonal

如何使用 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))
  1. !is.na(a)为我们提供了一个包含 TRUE、FALSE 值的列表,其中元素已被清空。
  2. which(!is.na(a))为我们提供了每个真实元素的下标列表。
  3. t(a)转置矩阵,因为我们需要根据 #2 中的下标进行拉取。
  4. t(a)[which(!is.na(a))]给我们一个缺少对角线 NA 值的数字列表。
  5. matrix(t(a)[which(!is.na(a))],nrow=3,ncol=4)将#4 中的列表转换为矩阵,这是我们想要的转置。
  6. 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/

相关文章:

python - 优化计算两幅图像之间的欧式距离的性能

python - 如何在python中将字符列表的每个元素插入到矩阵中

java - 需要数组,但找到了 List<List<Integer>>

r - 计算数据帧 R 中每行的值

r - Shiny 应用程序中的 Bootstrap 轮播

r - 具有过程限制的线性规划运输优化

python - 在 2D numpy 数组中对角线插入元素的最快方法是什么?

如果特定字符串不存在,则重命名列

Python:如何为字典分配一个长度不同的列表的值?

html - 如何用对 Angular 线 div 制作形状?