如何从矩阵中删除对角元素平方?

时间:2015-10-31 05:01:17

标签: r matrix

我们可以使用diag()来移除矩阵的对角元素,但是如果我们想要移除元素的对角线方块呢?就像在6x6矩阵中一样,我想在对角线中移除2x2的正方形。它看起来很基本,但如何在r?

中这样做
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   23   98   12   98   32   99
[2,]   54   11   13   02   31   78
[3,]   25   85   15   09   46   87
[4,]   98   98   16   17   45   48
[5,]   88   00   68   99   89   89
[6,]   05   33   66   12   14   78

我想将对角线方块设置为NA

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   NA   NA   12   98   32   99
[2,]   NA   NA   13   02   31   78
[3,]   25   85   NA   NA   46   87
[4,]   98   98   NA   NA   45   48
[5,]   88   00   68   99   NA   NA
[6,]   05   33   66   12   NA   NA

删除所有NA,然后我们合并列

     [,1] [,2] [,3] [,4]
 [1,]  12   98   32   99
 [2,]  13   02   31   78
 [3,]  25   85   46   87
 [4,]  98   98   45   48
 [5,]  88   00   68   99
 [6,]  05   33   66   12

3 个答案:

答案 0 :(得分:4)

我希望有更优雅的方式来做到这一点,但这是一种方式:

# Create a matrix
mat = matrix(1:36, nrow=6)

# Set block diagonal elements to NA
for (i in seq(1, nrow(mat), 2)) {
  mat[i:(i+1),i:(i+1)] = NA
}

# Reform the matrix with the NA values excluded
matrix(mat[!is.na(mat)], nrow=nrow(mat)-2)

答案 1 :(得分:2)

您可以使用Kronecker产品快速构建块对角矩阵,指示要保留哪些元素以及要删除哪些元素。

## An example matrix
set.seed(1)
m <- matrix(sample(1:100, 36), ncol=6)

## Construct a logical block diagonal matrix, then use it to remove blocks along diagonal
ii <- !kronecker(diag(1, nrow(m)/2), matrix(1, ncol=2, nrow=2))
matrix(m[ii], ncol = ncol(m)-2)
##      [,1] [,2] [,3] [,4]
## [1,]   57   19   32    1
## [2,]   89   16   63   28
## [3,]   20   61   51   87
## [4,]   86   34   10   42
## [5,]   58   88   21   70
## [6,]    6   83   29   13

答案 2 :(得分:2)

我们在matrix中创建3个list,使用bdiag构建块对角矩阵,双重否定将二进制强制转换为逻辑,用NA替换TRUE元素,乘以'm1'得到'm2'。

library(Matrix)
m2 <- as.matrix((NA^!!bdiag(lapply(1:3, matrix, data=1,ncol=2, nrow=2)))*m1)
m2
#      [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]   NA   NA   12   98   32   99
#[2,]   NA   NA   13    2   31   78
#[3,]   25   85   NA   NA   46   87
#[4,]   98   98   NA   NA   45   48
#[5,]   88    0   68   99   NA   NA
#[6,]    5   33   66   12   NA   NA

我们使用带有NA的{​​{1}}删除每行中的apply元素,以获得预期的输出。

MARGIN=1

数据

t(apply(m2, 1, function(x) x[!is.na(x)]))
 #      [,1] [,2] [,3] [,4]
#[1,]   12   98   32   99
#[2,]   13    2   31   78
#[3,]   25   85   46   87
#[4,]   98   98   45   48
#[5,]   88    0   68   99
#[6,]    5   33   66   12