R-如何将一个大的640x 640矩阵划分为对角很多(20-30)次

  • 本文关键字:划分 20-30 640x 一个 r matrix
  • 更新时间 :
  • 英文 :


i有一个640x 640矩阵,我试图将其分成较小的矩阵(类似于split.ppp(,但对角线x,x次。我将如何编写一个代码:它会对角线切割矩阵,将对角块中的所有值写入新矩阵?

提取大型基质的非对角线切片基本上喜欢这个问题,但要在整个矩阵中迭代它,直到所有切片都被解释为

我尝试使用此处的所有方法作为基础,但在将其应用于我的问题

时没有成功

https://i.stack.imgur.com/52ml2.jpg

从图片中,我取了一个矩阵,将其拼接成条(如图中(,然后将每个剪接绘制为点模式。我想要做同样的事情,但是这次将其对角线拼接

我已经垂直切割了30次矩阵,然后对它们进行了空间分析。我正在尝试做同样的事情,但现在对角线。

 #original
1 0 0 1 1 0
1 1 0 0 1 1
1 0 1 1 0 0
0 1 0 1 1 1
1 1 0 1 1 0
1 1 1 0 1 0
#new sub matrix containing slice
1 x x x x x
0 1 x x x x
1 0 1 x x x
x 0 1 1 x x
x x 1 0 0 x
x x x 1 0 1  
#next sub matrix ( moving along the diagonal
x 0 1 1 x x
x x 1 0 1 x
x x x 0 1 1
x x x x 0 0
x x x x x 1
x x x x x x 

重复直到考虑

的所有值

这是使用矩阵软件包的方法。

#some input
set.seed(42); m <- matrix(sample(0:1, 100, TRUE), 10)
library(Matrix)

首先,我们通过创建一个bandsparse矩阵来为切片定义一个"掩码":

mask <- bandSparse(nrow(m), ncol(m), (-2):0)
#10 x 10 sparse Matrix of class "ntCMatrix"
#                         
# [1,] | . . . . . . . . .
# [2,] | | . . . . . . . .
# [3,] | | | . . . . . . .
# [4,] . | | | . . . . . .
# [5,] . . | | | . . . . .
# [6,] . . . | | | . . . .
# [7,] . . . . | | | . . .
# [8,] . . . . . | | | . .
# [9,] . . . . . . | | | .
#[10,] . . . . . . . | | |

(-2):0定义了相对于对角线为0。

然后我们可以使用掩码:

m1 <- m
m1[!as.matrix(mask)] <- NA
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    0   NA   NA   NA   NA   NA   NA   NA   NA    NA
# [2,]    0    1   NA   NA   NA   NA   NA   NA   NA    NA
# [3,]    0    0    0   NA   NA   NA   NA   NA   NA    NA
# [4,]   NA    1    0    1   NA   NA   NA   NA   NA    NA
# [5,]   NA   NA    0    0    1   NA   NA   NA   NA    NA
# [6,]   NA   NA   NA    1    1    1   NA   NA   NA    NA
# [7,]   NA   NA   NA   NA    1    0    1   NA   NA    NA
# [8,]   NA   NA   NA   NA   NA    1    0    0   NA    NA
# [9,]   NA   NA   NA   NA   NA   NA    1    0    0    NA
#[10,]   NA   NA   NA   NA   NA   NA   NA    0    0     1

如果您不需要区分0和NA,它变得更加容易:

as.matrix(band(m, -2, 0))
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    0    0    0    0    0    0    0    0    0     0
# [2,]    0    1    0    0    0    0    0    0    0     0
# [3,]    0    0    0    0    0    0    0    0    0     0
# [4,]    0    1    0    1    0    0    0    0    0     0
# [5,]    0    0    0    0    1    0    0    0    0     0
# [6,]    0    0    0    1    1    1    0    0    0     0
# [7,]    0    0    0    0    1    0    1    0    0     0
# [8,]    0    0    0    0    0    1    0    0    0     0
# [9,]    0    0    0    0    0    0    1    0    0     0
#[10,]    0    0    0    0    0    0    0    0    0     1

要获取所有切片,您只需要将其包裹在一个循环中,该循环通过定义切片的对角线数迭代。

相关内容

最新更新