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