R 如何从矩阵中删除对角元素正方形?
我们可以使用diag()删除矩阵的对角元素,但如果我们要删除元素的对角正方形,该怎么办?就像在6x6矩阵中一样,我想删除对角线上的2x2个正方形。它看起来非常基本,但在r中如何做到这一点R 如何从矩阵中删除对角元素正方形?,r,matrix,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
[,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
删除所有NAs,然后合并列
[,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
我希望有一种更优雅的方法可以做到这一点,但这里有一种方法:
# 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)
您可以使用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
##示例矩阵
种子(1)
m我们在一个列表中创建3个矩阵
,用bdiag
构建一个块对角矩阵,双求反将二进制强制为逻辑,用NA替换真元素,用'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
数据
m1如何删除它?你还剩下什么?它将有助于包括一个示例输入和所需输出。
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
m1 <- structure(c(23L, 54L, 25L, 98L, 88L, 5L, 98L, 11L, 85L, 98L,
0L, 33L, 12L, 13L, 15L, 16L, 68L, 66L, 98L, 2L, 9L, 17L, 99L,
12L, 32L, 31L, 46L, 45L, 89L, 14L, 99L, 78L, 87L, 48L, 89L, 78L
), .Dim = c(6L, 6L))