按距单元格 (R) 的距离对矩阵中的向量求和

sum vectors in a matrix by distance from a cell (R)

假设我有一个矩阵 A,维度 n x m。一个起始单元格 (i,j),以及一个满足 k < n x m.

的常数 k

我需要一种方法来提取 A 内的值,以便所有值都在距起始单元格的 k 步内。步骤是列移动或行移动。 然后我希望通过 2 组对提取的值求和,其中 1 组由从原始矩阵中同一列获得的总和组成,另一组是从原始矩阵各行的值求和获得的总和。

对我来说重要的是,这解决了起始单元格在距矩阵边缘 k 步以内的情况。 示例集(我在这里进行了大量简化):

> #create matrix where m = 7,n = 7
> Mat <- sample(1:49,49) %>% matrix(7,7)
> 
> #declare starting cell where (i = 4, j = 2)
> i = 4
> j = 2
> 
> #declare number of steps
> k = 2
> 
> Mat
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]   25   35   29   10   16   46   23
[2,]   32   43    7    5   31    1   14
[3,]   36   19   49   45   13   41   47
[4,]   17   18   48    9    3   28   12
[5,]   26    6   30   33   20    2   11
[6,]   40   24   39   21   37   38    8
[7,]    4   15   34   22   27   44   42
> Mat[i,j]
[1] 18

对于此示例,输出将是两个向量(一个用于列总和,一个用于行总和):

> Columnsum  <- c(sum(36,17,26) ,           #sum(Mat[3:5,1])
+                 sum(43,19,18,6,24),       #sum(Mat[2:6,2])
+                 sum(49,48,30),            #sum(Mat[3:5,3])
+                 sum(9))                   #sum(Mat[4:4,3])
> 
> Rowsum <- c(sum(43),                       #sum(Mat[2,2:2])
+             sum(36,19,49),                 #sum(Mat[3,1:3])
+             sum(17,18,48,9),               #sum(Mat[4,1:4])
+             sum(26,6,30),                  #sum(Mat[5,1:3])
+             sum(24))                       #sum(Mat[6,2:2])
>             
> Columnsum
[1]  79 110 127   9
> Rowsum
[1]  43 104  92  62  24

您可以 'remove' 矩阵 Mat 的部分,其中的条目距离 (i,j)k 步,方法是用 NA 覆盖它们:

Mat[abs(row(Mat) - i) + abs(col(Mat) - j) > k] <- NA

然后删除完全NA:

的行和列
Mat <- Mat[rowSums(is.na(Mat)) != ncol(Mat), colSums(is.na(Mat)) != nrow(Mat)]

最后您可以计算行和列的总和:

Columnsum <- colSums(Mat, na.rm = TRUE)
Rowsum <- rowSums(Mat, na.rm = TRUE)